封装Sqlite查询回调函数C++

问题描述 投票:0回答:1

在sqlite3的C API中,函数sqlite3_exec需要一个回调函数作为参数,定义为

static int callback(void* data, int argc, char** argv, char** azColName)

我希望使用包装函数在主回调之前执行它。 IE。将我的包装函数传递给 sqlite3_exec() ,它调用实际的回调。

说明我想要实现的目标的一个实际用例是记录响应。由于记录响应的代码(在我的用例中)不会因不同的查询而改变,因为它可以循环发送的列数,所以我希望将日志记录定义为once(即在包装器中)而不是为定义的所有任意数量的未来回调函数重新定义它。

这似乎是可行的方法,但我不知道如何实现。

我尝试创建一个接受另一个参数的包装器 - 实际的回调,但是传递这个参数当然不起作用,因为函数定义不同。

c++ sqlite callback
1个回答
0
投票

也许是这样的:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.