在sqlite3的C API中,函数sqlite3_exec需要一个回调函数作为参数,定义为
static int callback(void* data, int argc, char** argv, char** azColName)
我希望使用包装函数在主回调之前执行它。 IE。将我的包装函数传递给 sqlite3_exec() ,它调用实际的回调。
说明我想要实现的目标的一个实际用例是记录响应。由于记录响应的代码(在我的用例中)不会因不同的查询而改变,因为它可以循环发送的列数,所以我希望将日志记录定义为once(即在包装器中)而不是为定义的所有任意数量的未来回调函数重新定义它。
这似乎是可行的方法,但我不知道如何实现。
我尝试创建一个接受另一个参数的包装器 - 实际的回调,但是传递这个参数当然不起作用,因为函数定义不同。
也许是这样的:
struct OriginalCallback {
int (*callback)(void*,int,char**,char**);
void* data;
};
int WrapperCallback(void* data, int argc, char** argv, char** col_names) {
// Do the work
OriginalCallback* original = static_cast<OriginalCallback>(data);
return original->callback(original->data, argc, argv, col_names);
}
int WrapSqliteExec(sqlite3* db, const char *sql,
int (*callback)(void*,int,char**,char**),
void* data, char **errmsg) {
OriginalCallback original{callback, data};
return sqlite3_exec(db, sql, WrapperCallback, &original, errmsg);
}