From 911ebeea74fd09a8460324b652071b6bd3f99391 Mon Sep 17 00:00:00 2001 From: "A.N" Date: Tue, 6 Sep 2016 18:12:10 +0300 Subject: [PATCH] TraceInfo: fix RunTimeNanosec retrieval, add AutoCommit Also change type of EventCode to uint32 so adding AutoCommit is "free" = does not enlarge the TraceInfo struct. 32 bits are more than enough, since only 4 (four) are used now. --- tracecallback.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/tracecallback.go b/tracecallback.go index 8ecfae9..2091058 100644 --- a/tracecallback.go +++ b/tracecallback.go @@ -33,7 +33,11 @@ const ( ) type TraceInfo struct { - EventCode uint + // Pack together the shorter fields, to keep the struct smaller. + // On a 64-bit machine there would be padding + // between EventCode and ConnHandle; having AutoCommit here is "free": + EventCode uint32 + AutoCommit bool ConnHandle uintptr // Usually filled, unless EventCode = TraceClose = SQLITE_TRACE_CLOSE: @@ -122,7 +126,8 @@ func traceCallbackTrampoline( var info TraceInfo - info.EventCode = traceEventCode + info.EventCode = uint32(traceEventCode) + info.AutoCommit = (int(C.sqlite3_get_autocommit(contextDB)) != 0) info.ConnHandle = connHandle switch traceEventCode { @@ -146,7 +151,13 @@ func traceCallbackTrampoline( case TraceProfile: info.StmtHandle = uintptr(p) - info.RunTimeNanosec = int64(uintptr(xValue)) + + if xValue == nil { + panic("NULL pointer in X arg of trace_v2 callback for SQLITE_TRACE_PROFILE event") + } + + info.RunTimeNanosec = *(*int64)(xValue) + // sample the error //TODO: is it safe? is it useful? fillDBError(&info.DBError, contextDB)