Swift 用于日志记录的SQLite跟踪

Swift 用于日志记录的SQLite跟踪,swift,sqlite,Swift,Sqlite,我试图调试代码中的一些SQLite查询,只需将发生的一切记录到控制台,但似乎几乎没有相关信息-谷歌搜索“sqlite3_trace_v2 swift”只返回两页结果,除了上面的链接之外,没有任何一页结果有用。使用以下代码,我能够使它至少运行跟踪回调: func traceSQL (database: OpaquePointer?) { var pointer: OpaquePointer? func traceCallback (mask: UInt32, pointer: Un

我试图调试代码中的一些SQLite查询,只需将发生的一切记录到控制台,但似乎几乎没有相关信息-谷歌搜索“sqlite3_trace_v2 swift”只返回两页结果,除了上面的链接之外,没有任何一页结果有用。使用以下代码,我能够使它至少运行跟踪回调:

func traceSQL (database: OpaquePointer?) {
    var pointer: OpaquePointer?
    func traceCallback (mask: UInt32, pointer: UnsafeMutableRawPointer?, query: UnsafeMutableRawPointer?, result: UnsafeMutableRawPointer?) -> Int32 {
        print("SQLite Trace:")

        if let query = query?.load(as: UnsafePointer<Int8>.self) {
            print(String(cString: query))
        } else {
            print("Could not load query.")
        }

        if let result = result?.load(as: UnsafePointer<Int8>.self) {
            print(String(cString: result))
        } else {
            print("Could not load result.")
        }

        return 0
    }
    sqlite3_trace_v2(database, 15, traceCallback as @convention(c) (UInt32, UnsafeMutableRawPointer?, UnsafeMutableRawPointer?, UnsafeMutableRawPointer?) -> Int32, &pointer)
}
func-traceSQL(数据库:OpaquePointer?){
变量指针:不透明指针?
func traceCallback(掩码:UInt32,指针:UnsafemtableRawPointer?,查询:UnsafemtableRawPointer?,结果:UnsafemtableRawPointer?->Int32{
打印(“SQLite跟踪:”)
如果let query=query?.load(作为:UnsafePointer.self){
打印(字符串(cString:query))
}否则{
打印(“无法加载查询”)
}
如果let result=result?.load(作为:UnsafePointer.self){
打印(字符串(cString:result))
}否则{
打印(“无法加载结果”)
}
返回0
}
sqlite3_trace_v2(数据库,15,traceCallback为@convention(c)(UInt32,UnsafeMutableRawPointer?,UnsafeMutableRawPointer?,UnsafeMutableRawPointer?),UnsafeMutableRawPointer?->Int32,&pointer)
}
但我不知道该如何处理函数的输出-目前,它只是打印出一个不可读的字符字符串,而我以前的尝试甚至没有做到这一点。我怀疑至少有一部分问题是我真的不知道如何在Swift中使用
unsafemtablerawpointer
(其他一些似乎缺少可用信息的东西)


tl;dr:如何记录SQLite的跟踪结果?

代码中的主要错误是取消了原始指针的限制 传递给回调,而不是重新解释(强制转换)它们。 此外,这些指针的含义对于不同的对象也不同 事件

下面是一个如何跟踪各种事件以及如何转换的示例 原始指针指向“正确”类型,使用文字闭包 作为回拨。解释
p
x
这一论据来自于

让traceMask=SQLITE_TRACE_STMT | SQLITE_TRACE_PROFILE | SQLITE_TRACE_ROW | SQLITE_TRACE_CLOSE
sqlite3_trace_v2(数据库,UInt32(traceMask),{(原因,上下文,p,x)->Int32 in
开关Int32(原因){
案例SQLITE\u TRACE\u STMT:
//P参数是指向准备好的语句的指针。
//X参数是指向字符串的指针,该字符串是未展开的SQL文本
警卫
设pStmt=不透明指针(p),
让cSql=x?.assumingMemoryBound(到:CChar.self)
否则{
返回0
}
让sql=String(cString:cSql)//未展开的sql文本
让expandedSql=String(cString:sqlite3_expanded_sql(pStmt))//扩展的sql文本
打印(“SQLITE\u TRACE\u STMT:”,expandedSql)
案例SQLITE_跟踪_配置文件:
//P参数是指向准备好的语句的指针,X参数指向
//到一个64位整数,该整数是
//准备好的声明需要运行。
警卫
设pStmt=不透明指针(p),
让持续时间=x?荷载(as:UInt64.self)
否则{
返回0
}
设毫秒=双倍(持续时间)/双倍(纳秒/毫秒)
让sql=String(cString:sqlite3_sql(pStmt))//未展开的sql文本
打印(“SQLITE_TRACE_PROFILE:”,毫秒,“ms for statement:”,sql)
案例SQLITE\u TRACE\u行:
//P参数是指向准备好的语句的指针,X参数未使用。
警卫
设pStmt=OpaquePointer(p)
否则{
返回0
}
打印(“SQLITE\u TRACE\u行”)
案例SQLITE_TRACE_CLOSE:
//P参数是指向数据库连接对象的指针,X参数未使用。
警卫
让数据库=不透明指针(p)
否则{
返回0
}
打印(“SQLITE\u跟踪\u关闭”)
违约:
打破
}
返回0
},无)
当然,您可以将跟踪模式限制为您选择的事件 你对……感兴趣

let traceMask=SQLITE\u TRACE\u STMT
只跟踪准备好的语句