如何将数据库附加到可删除的数据库

时间:2018-01-24 12:02:33

标签: c sqlite

根据SQLite release notes,可以将数据库附加到可执行文件:

  

Append VFS是允许SQLite数据库的VFS shim   附加到其他文件。这允许(例如)数据库   被附加到可执行文件,然后打开并读取数据库。

我该怎么做?

1 个答案:

答案 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.dllappendvfs.so / sqlite3文件加载到.load命令行shell中,并在您的应用程序中创建数据库& #39;来自那里的可执行文件,手动或使用脚本。