c - 如何以不同模式在同一数据库上打开两个 SQLite 上下文?

标签 c sqlite

我正在尝试使用内存中的 SQLite 数据库,同时需要 2 个上下文(一个只读,另一个读写)。似乎正在发生的是第一个上下文的模式被所有后续上下文使用,而不管它们被要求使用什么模式。

我的代码大致执行以下操作:

char *err;
sqlite3 rw, ro;
int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_URI;

sqlite3_open("file::memory:?cache=shared", &rw, flags);
sqlite3_open("file::memory:?cache=shared&mode=ro", &ro, flags);

// works as expected
sqlite3_exec(rw, "CREATE TABLE t (a TEXT)", NULL, NULL, &err);

// works as expected
sqlite3_exec(ro, "SELECT 1", NULL, NULL, &err);

// !!!!!!! Expected to fail but doesn't ??????????
sqlite3_exec(ro, "INSERT INTO t (a) VALUES ('a')", NULL, NULL, &err);
  • 如果我反转前两行,则 CREATE 语句失败。
  • 我也尝试过使用 SQLITE_OPEN_READONLY 而不是 &mode=ro 但没有任何区别。

编辑:

来自 further reading它看起来像是在做一个内存数据库 isa “模式”,因此与 rorw “模式”并不完全正交。

其他不起作用的东西:

int flags = SQLITE_OPEN_URI;
sqlite3_open("file::memory:?cache=shared&mode=rw", &rw, SQLITE_OPEN_READWRITE | flags);
sqlite3_open("file::memory:?cache=shared&mode=ro", &ro, SQLITE_OPEN_READONLY | flags);

int flags = SQLITE_OPEN_URI;
sqlite3_open("file::memory:?cache=shared", &rw, SQLITE_OPEN_READWRITE | flags);
sqlite3_open("file::memory:?cache=shared", &ro, SQLITE_OPEN_READONLY | flags);

最佳答案

tl;博士;这是做不到的。共享缓存意味着共享访问模式,先打开为准。

在与“专家”交谈后,我得出的结论是 SQLITE_OPEN_READONLYSQLITE_OPEN_READWRITE 不是安全属性,不应被解释为 “Open DB 允许...” 而不是“假设底层文件是...打开 DB” 或者,“如果文件被读取则不会失败只有”

静默提升似乎仍然是一个错误,但与意图一致。 OTOH 文档中似乎没有很好地表达意图。

关于c - 如何以不同模式在同一数据库上打开两个 SQLite 上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16241629/

相关文章:

c - printf的原型(prototype)和实现

c++/c 访问具有不同名称和大小的多个字符数组

android - 显示存储在 SQlite 数据库中的所有记录

android - 如何确保数据只在 SQLite 中插入一次?

c# - SQLite.net 多线程

c - gromacs 编译给出 undefined reference 错误

C - 方便处理RAM中的某些数据布局

c - C实现中的多路树搜索算法

sql - SQLite如何获取时间范围内可用报价的平均值

c# - 受密码保护的 SQLite 数据库