1

我正在尝试使用内存中的 SQLite DB,同时需要 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);
  • 如果我反转前 2 行,则该CREATE语句将失败。
  • 我也尝试过使用SQLITE_OPEN_READONLY而不是&mode=ro,但它没有区别。

编辑:

进一步 阅读ro来看,它看起来像是在做一个内存数据库是“模式”,因此与“模式”并不完全正交rw

其他不起作用的事情:

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);
4

2 回答 2

2

tl;博士; 这是不可能的。共享缓存意味着共享访问模式,并且首先打开获胜。

在与“专家”交谈后,我得出的结论是,它SQLITE_OPEN_READONLY不是SQLITE_OPEN_READWRITE安全属性,不应被解释为“打开数据库以允许...”,而是“假设基础文件是打开数据库... "或者,"如果文件是只读的,不要失败"

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

于 2013-04-30T20:13:06.840 回答
0

乍一看,OPEN_READWRITE 标志似乎覆盖了 URI 中的 mode=ro。尝试将第二个 open 替换为:

sqlite3_open("file::memory:?cache=shared&mode=ro", &ro,SQLITE_OPEN_URI);
于 2013-04-26T17:10:14.870 回答