如何在数据库中构建sqlite VFS

时间:2018-10-18 03:03:09

标签: sqlite vfs

我试图将SQLite编译成一个库,然后另一个应用程序将要链接到该库。由于超出了此问题的范围,我无法将SQLite直接编译到该应用程序中。

但是,我需要一个VFS可用,默认情况下不可用。为了弄清楚如何使它工作,我尝试使vfstrace填充程序可用于链接到SQLite的应用程序。这很容易证明它是有效的,因为我可以通过填充程序记录SQLite VFS活动,并在应用程序调用SQLite时看到它实际上正在使用。

我该怎么做?我发现的所有示例都显示了当您拥有源文件(例如shell.c)并进行编译时(sqlite3.c和test_vfstrace.c生成可执行文件)的情况。但是,我没有这种奢侈。我可以编译sqlite.c和test_vfstrace.c并生成libsqlite3.so库文件,但是没有“ main”函数可以在其中调用vfstrace_register,因此VFS实际上可用。在库的情况下,还有其他挂钩可以设置吗?如果没有,如何使新的VFS可用?

1 个答案:

答案 0 :(得分:0)

SQLite是通过sqlite3_initialize()函数初始化的,当用户调用sqlite3_open()之类的各种函数时,SQLite会自动调用SQLite,尽管在随后的调用中它是空操作。该函数依次调用操作系统特定的初始化函数sqlite3_os_init()。这是初始化SQLite内置的所有VFS的函数。

对于给定的示例VFS,将test_vfstrace.c附加到合并后,然后在return语句之前的sqlite3_os_init()中进行如下调用:

  vfstrace_register("trace",0,(int(*)(const char*,void*))fputs,stderr,1);

然后使用这些修改来构建库。

最后一个参数的值1将使该VFS成为默认值,因此,如果您不希望为通过链接的代码执行的每个SQLite操作打印的跟踪消息打印出来,则将其更改为{{1 }},并在打开数据库以跟踪调用时显式指定此VFS。例如,指定0 compile time option,然后传递form的文件名:SQLITE_USE_URI,其中“ "file:database.db?vfs=unix"”是文件的实际名称。打开。