如何在不同模式下在同一个DB上打开两个SQLite上下文?

时间:2013-04-26 17:01:38

标签: c sqlite

我正在尝试使用内存中的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);
  • 如果我反转前两行,则CREATE语句将失败。
  • 我也尝试过使用SQLITE_OPEN_READONLY而非&mode=ro,但没有区别。

编辑:

further reading起,内存数据库看起来像是“模式”,因此与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);

2 个答案:

答案 0 :(得分:2)

TL;博士;它无法完成。共享缓存意味着共享访问模式,以及首次开放获胜。

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

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

答案 1 :(得分:0)

乍一看,看起来OPEN_READWRITE标志覆盖了URI中的mode = ro。 尝试用第二个打开替换:

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