C (Linux RHEL5、64 ビット) で sqlite3 API を使用して.db
、.db-journal
ファイルが残っているクラッシュから回復する際に問題が発生しています。
バイナリ自体で.db
ファイルを調べて実行すると、バイナリはファイルを削除して正常に回復します。 sqlite3
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 */
db-journal ファイルを使用して回復することを sqlite に伝えるにはどうすればよいですか?
#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