gpt4 book ai didi

c - 当 db-journal 文件存在时准备语句会导致 SQLITE_IOERR_LOCK

转载 作者:太空宇宙 更新时间:2023-11-04 03:58:11 27 4
gpt4 key购买 nike

我在使用 C(Linux RHEL5,64 位)中的 sqlite3 API 从崩溃中恢复时遇到问题,我只剩下一个 .db 和一个 .db -journal 文件。

如果我用 sqlite3 二进制本身检查 .db 文件并运行 SELECT * from t;,二进制会删除 .db-journal 文件并恢复正常。

然而,在我的应用程序中,我在有效的 sqlite* 上准备了相同的语句,它返回 SQLITE_IOERR | SQLITE_IOERR_LOCK:

#define SQLITE_IOERR_LOCK              (SQLITE_IOERR | (15<<8))
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */

我如何告诉 sqlite 我希望它使用 db-journal 文件恢复?

#include "sqlite3.h"
#include <stdio.h>
#include <string.h>

int main(int argc,char* argv[])
{
sqlite3* db_ptr = NULL;
int sqlite_result = SQLITE_ERROR;
sqlite3_stmt* query=NULL;
int prepare_result=-1;

if ( argc > 2 )
{
sqlite_result = sqlite3_open_v2(argv[1],
&db_ptr,
SQLITE_OPEN_READONLY,
NULL);
if ( sqlite_result == SQLITE_OK )
{
sqlite3_extended_result_codes(db_ptr,1);
prepare_result = sqlite3_prepare_v2(db_ptr,
argv[2],
strlen(argv[2])+1,
&query,
NULL);
sqlite3_close(db_ptr);
if ( prepare_result != SQLITE_OK )
{
fprintf(stderr,"Error: %d\n",prepare_result);
}
else
{
fprintf(stdout,"Success\n");
}
}
}

return prepare_result;
}

结果:

Error: 3850

最佳答案

我在阅读我的问题时找到了答案...显然要恢复到 db 文件,程序需要以 READWRITE 访问权限打开它。呃。改变:

    sqlite_result = sqlite3_open_v2(argv[1],
&db_ptr,
SQLITE_OPEN_READONLY,
NULL);

到:

    sqlite_result = sqlite3_open_v2(argv[1],
&db_ptr,
SQLITE_OPEN_READWRITE,
NULL);

解决了这个问题。在实际程序中,而不是测试应用程序中,我的 open 离 prepare 语句很远,以至于我什至没有注意到它在那个特定情况下是只读的。

关于c - 当 db-journal 文件存在时准备语句会导致 SQLITE_IOERR_LOCK,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14525557/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com