根据SQLite release notes,可以将数据库附加到可执行文件:
Append VFS是允许SQLite数据库的VFS shim 附加到其他文件。这允许(例如)数据库 被附加到可执行文件,然后打开并读取数据库。
我该怎么做?
答案 0 :(得分:1)
只需将扩展程序加载或链接到您的应用程序中,然后使用该VFS打开数据库:
// append-test.c
#include <stdio.h>
#include <sqlite3.h>
int main()
{
extern int sqlite3_appendvfs_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_appendvfs_init(NULL, NULL, NULL); // this works only if linked statically
sqlite3 *db;
sqlite3_open_v2("append-test", &db,
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
"apndvfs");
// error handling is for wimps
sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS test(msg)", NULL, NULL, NULL);
sqlite3_stmt *stmt;
sqlite3_prepare_v2(db, "SELECT msg FROM test", -1, &stmt, NULL);
switch (sqlite3_step(stmt)) {
case SQLITE_DONE:
sqlite3_exec(db, "INSERT INTO test VALUES('Hello, world!')", NULL, NULL, NULL);
break;
case SQLITE_ROW:
puts(sqlite3_column_text(stmt, 0));
break;
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
使用静态链接时,the extension must be compiled with SQLITE_CORE
:
$ gcc -o append-test -D SQLITE_CORE append-test.c sqlite3.c appendvfs.c -lpthread -ldl
无法写入正在执行的可执行文件,因此请运行副本:
$ ls -l -rwxr-xr-x 1 cl users 901336 Jan 24 20:09 append-test $ cp append-test append-test-2; append-test-2; rm append-test-2 $ ls -l -rwxr-xr-x 1 cl users 913433 Jan 24 20:09 append-test $ append-test Hello, world!
在现实世界中,您将使用appendvfs.dll
将appendvfs.so
/ sqlite3
文件加载到.load
命令行shell中,并在您的应用程序中创建数据库& #39;来自那里的可执行文件,手动或使用脚本。