我正在用C编写一个使用sqlite3的应用程序,我希望所有的查询和错误都被动地记录到stderr中以便调试。
假设我有这样的代码(省略错误处理):
void main(void)
{
sqlite3_config(SQLITE_CONFIG_LOG, errorLogCallback, NULL);
sqlite3 *db = NULL;
sqlite3_open_v2("main.db3", &db, SQLITE_OPEN_READWRITE, NULL);
sqlite3_trace_v2(db, SQLITE_TRACE_STMT, tracer, NULL);
// this code cannot change
sqlite3_exec(db, "SELECT * FROM users", NULL, NULL, NULL);
sqlite3_exec(db, "SELECT * FROM users_nonexistant", NULL, NULL, NULL);
}
static void errorLogCallback(void *, int iErrCode, const char *zMsg)
{
fprintf(stderr, "(%d) %s\n", iErrCode, zMsg);
}
static int tracer(unsigned, void*, void *p, void*)
{
sqlite3_stmt *stmt = (sqlite3_stmt*)p;
char *sql = sqlite3_expanded_sql(stmt);
fprintf(stderr, "%s\n", sql);
sqlite3_free(sql);
return 0;
}
输出:
SELECT * FROM users
(1) no such table: users_nonexistant
我怎样才能让它输出这个?
SELECT * FROM users
SELECT * FROM users_nonexisant
(1) no such table: users_nonexistant
2条答案
按热度按时间ipakzgxi1#
阅读sqlite3_config的文档会得到这样的page about Configuration Options,
SQLITE配置日志
SQLITE_CONFIG_LOG
选项用于配置SQLite全局错误日志。SQLITE_CONFIG_LOG
选项有两个参数:一个指向调用签名为void (*)(void*, int, const char*)
的函数的指针,以及一个指向void
的指针。如果函数指针不是NULL
,则sqlite3_log()
调用它来处理每个日志事件。如果函数指针是NULL
,则sqlite3_log()
接口变为空操作。SQLITE_CONFIG_LOG
的第二个参数的void指针将作为该函数的第一个参数传递**。记录器函数的第二个参数是对应sqlite3_log()
调用的第一个参数的副本,并且旨在作为结果代码或扩展结果代码。传递给logger的第三个参数是sqlite3_snprintf()
化后的日志消息,SQLite日志接口不可重入;应用程序提供的logger函数不能调用任何SQLite接口。在多线程应用程序中,应用程序定义的logger函数必须是线程安全的。这意味着您可以传递一个
char** pStatement
,它将指向要执行的char*
sql语句。wecizke32#
语句跟踪器仅为实际运行的语句调用。
SQL语句在编译之前没有内置的日志机制,如果不能修改
sqlite3_exec
调用,就必须修改SQLite的源代码,并在其中添加日志调用。