Package Sqlite查询回调函数C++

bbuxkriu  于 2024-01-09  发布在  SQLite
关注(0)|答案(1)|浏览(338)

在sqlite3的C API中,函数sqlite3_exec需要回调函数作为参数,由

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

字符串
我想让它在主回调之前使用一个 Package 器函数来执行。即,将我的 Package 器函数传递给sqlite3_exec(),它调用实际的回调。
一个实际的用例来说明我试图实现的是记录响应。由于记录响应的代码(在我的用例中)不会在不同的查询中改变,因为它可以循环发送的列数,我希望记录定义 * 一次 *(即在 Package 器中),而不是为所有任意数量的未来回调函数重新定义它。
这似乎是要走的路,但我不知道如何实现这一点。
我试过创建一个接受另一个参数的 Package 器-实际的回调,但是传递这个参数当然不起作用,因为函数定义不同。

**更新:**无法编译的示例代码

  1. #include <sqlite3.h>
  2. #include <iostream>
  3. #include <vector>
  4. class Callback
  5. {
  6. public:
  7. Callback( int(*callback)(void* data, int argc, char** argv, char** azColName), void* data )
  8. : m_callback(callback), m_data(data) {}
  9. ~Callback(){}
  10. public:
  11. int CallbackWrapper(void* data, int argc, char** argv, char** azColName)
  12. {
  13. //Do something
  14. return m_callback(m_data, argc, argv, azColName);
  15. }
  16. private:
  17. int (*m_callback)(void* data, int argc, char** argv, char** azColName);
  18. void* m_data;
  19. };
  20. class Product_Queries
  21. {
  22. public:
  23. Product_Queries() {}
  24. ~Product_Queries() {}
  25. public:
  26. int GetProductIds_Callback(void* data, int argc, char** argv, char** azColName){
  27. std::vector<int>* ids = (std::vector<int>*)data;
  28. ids->push_back(std::stoi(argv[0]));
  29. return 0;
  30. }
  31. };
  32. int main(int argc, char* argv[])
  33. {
  34. sqlite3* db;
  35. sqlite3_open("database.db", &db);
  36. Product_Queries product_queries;
  37. std::vector<int> productIds;
  38. Callback callback(product_queries.GetProductIds_Callback, (void*)&productIds); //Error here
  39. sqlite3_exec(db, "SELECT id FROM Products", callback.CallbackWrapper, nullptr, nullptr); //Error here
  40. sqlite3_close(db);
  41. return 0;
  42. }


两个错误都是invalid use of non-static member function

gj3fmq9x

gj3fmq9x1#

也许沿着这样的:

  1. struct OriginalCallback {
  2. int (*callback)(void*,int,char**,char**);
  3. void* data;
  4. };
  5. int WrapperCallback(void* data, int argc, char** argv, char** col_names) {
  6. // Do the work
  7. OriginalCallback* original = static_cast<OriginalCallback*>(data);
  8. return original->callback(original->data, argc, argv, col_names);
  9. }
  10. int WrapSqliteExec(sqlite3* db, const char *sql,
  11. int (*callback)(void*,int,char**,char**),
  12. void* data, char **errmsg) {
  13. OriginalCallback original{callback, data};
  14. return sqlite3_exec(db, sql, WrapperCallback, &original, errmsg);
  15. }

字符串

展开查看全部

相关问题