Package Sqlite查询回调函数C++

bbuxkriu  于 12个月前  发布在  SQLite
关注(0)|答案(1)|浏览(244)

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

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

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

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

#include <sqlite3.h>

#include <iostream>
#include <vector>

class Callback
{
    public:
        Callback( int(*callback)(void* data, int argc, char** argv, char** azColName), void* data )
            : m_callback(callback), m_data(data) {}
        ~Callback(){}

    public:
        int CallbackWrapper(void* data, int argc, char** argv, char** azColName)
        {
            //Do something

            return m_callback(m_data, argc, argv, azColName);
        }

    private:
        int (*m_callback)(void* data, int argc, char** argv, char** azColName);
        void* m_data;
};

class Product_Queries
{
    public:
        Product_Queries() {}
        ~Product_Queries() {}

    public:
        int GetProductIds_Callback(void* data, int argc, char** argv, char** azColName){
            std::vector<int>* ids = (std::vector<int>*)data;
            ids->push_back(std::stoi(argv[0]));

            return 0;
        }
};


int main(int argc, char* argv[])
{
    sqlite3* db;
    sqlite3_open("database.db", &db);

    Product_Queries product_queries;
    std::vector<int> productIds;
    Callback callback(product_queries.GetProductIds_Callback, (void*)&productIds); //Error here

    sqlite3_exec(db, "SELECT id FROM Products", callback.CallbackWrapper, nullptr, nullptr); //Error here

    sqlite3_close(db);

    return 0;
}


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

gj3fmq9x

gj3fmq9x1#

也许沿着这样的:

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);
}

字符串

相关问题