如何在sqlite3中加载扩展?

时间:2017-07-14 11:46:19

标签: c visual-studio sqlite

我正在尝试加载regexp.c扩展名以将REGEXP运算符添加到sqlite中。我做了什么:

  1. 下载sqlite3合并文件
  2. 找到regexp.c loadable extension
  3. 在VS2015中创建测试项目

    #include <stdio.h>
    #include "stdafx.h"
    #include "sqlite3.h"
    
    const char* SQL = "SELECT load_extension('sqlite3.obj', 'sqlite3_regexp_init');";
    
    int main(int argc, char **argv) {
    
        sqlite3 *db = 0; // the hande of connection object to db
        char *err = 0;
        char *errMsg = "unable to load extension";
    
        // open connection
        if (sqlite3_open("my_cosy_database.dblite", &db))
            fprintf(stderr, "Error during opening/creation DB: %s\n", sqlite3_errmsg(db));
        /*else if (sqlite3_db_config(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, 1, 0))
        {
            fprintf(stderr, "Cannot enable extensions loading: %s\n", sqlite3_errmsg(db));
        }*/
        else if (sqlite3_enable_load_extension(db, 1))
        {
            fprintf(stderr, "Cannot enable extensions loading: %s\n", sqlite3_errmsg(db));
        }
        // execute SQL
        else if (sqlite3_load_extension(db, "sqlite3.obj", "sqlite3_regexp_init", &errMsg))
        {
            fprintf(stderr, "Cannot load sqlite3_regexp_init extension: %s\n", sqlite3_errmsg(db));
        }
        else if (sqlite3_exec(db, SQL, callback, 0, &err))
        {
            fprintf(stderr, "Ошибка SQL: %sn", err);
            sqlite3_free(err);
        }
        // close connection
        sqlite3_close(db);
        return 0;
    }
    
  4. Official documentation说:“出于安全原因,默认情况下会关闭扩展加载。为了使用C语言或SQL扩展加载函数,必须首先使用sqlite3_db_config启用扩展加载(db, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION,1,NULL)应用程序中的C语言API。“所以这就是我所做的。问题是我每次调用sqlite3_load_extension或sqlite3_exec时都得到this terrible error。注释sqlite3_enable_load_extension和未注释的sqlite3_db_config会出现同样的问题。我不知道是什么导致了这个异常,并且没有明确的C api用法示例(即使在'Using Sqlite'一书中)。我能找到的一件事是引起这种异常的陈述:“( pCtx-&gt; pFunc-&gt; xSFunc)(pCtx,pCtx-&gt; argc,pCtx-&gt; argv); / IMP:R-24505-23230 * /“在SQLITE_PRIVATE int sqlite3VdbeExec(Vdbe p / VDBE * /)。

    所以,请帮助。

0 个答案:

没有答案