C 当数据库日志文件存在时,准备语句会导致SQLITE\u IOERR\u锁定
我在使用C(Linux RHEL5,64位)中的sqlite3 API从崩溃中恢复时遇到了一个问题,当时我只剩下C 当数据库日志文件存在时,准备语句会导致SQLITE\u IOERR\u锁定,c,sqlite,C,Sqlite,我在使用C(Linux RHEL5,64位)中的sqlite3 API从崩溃中恢复时遇到了一个问题,当时我只剩下.db和.db journal文件 如果我用sqlite3二进制文件本身检查.db文件并运行SELECT*fromt,二进制文件将删除.db日志文件并恢复正常 然而,在我的应用程序中,我在一个有效的sqlite*上准备了相同的语句,它返回sqlite\u IOERR | sqlite\u IOERR\u LOCK: #define SQLITE_IOERR_LOCK
.db
和.db journal
文件
如果我用sqlite3
二进制文件本身检查.db
文件并运行SELECT*fromt
,二进制文件将删除.db日志
文件并恢复正常
然而,在我的应用程序中,我在一个有效的sqlite*
上准备了相同的语句,它返回sqlite\u IOERR | sqlite\u IOERR\u LOCK
:
#define SQLITE_IOERR_LOCK (SQLITE_IOERR | (15<<8))
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
我在阅读我的问题时找到了答案…显然,要恢复到db文件,程序需要使用读写访问权限打开它。嗯。更改:
sqlite_result = sqlite3_open_v2(argv[1],
&db_ptr,
SQLITE_OPEN_READONLY,
NULL);
致:
解决了这个问题。在真实的程序中,而不是在测试应用程序中,我打开的语句与prepare语句相距甚远,以至于我甚至没有注意到在特定情况下它是只读的。我在阅读我的问题时找到了答案……显然,要恢复到db文件,程序需要使用READWRITE访问权限打开它。嗯。更改:
sqlite_result = sqlite3_open_v2(argv[1],
&db_ptr,
SQLITE_OPEN_READONLY,
NULL);
致:
解决了这个问题。在真实的程序中,而不是在测试应用程序中,我打开的语句与prepare语句相距甚远,以至于我甚至没有注意到它在特定情况下是只读的
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);