1

C (Linux RHEL5、64 ビット) で sqlite3 API を使用して.db.db-journalファイルが残っているクラッシュから回復する際に問題が発生しています。

バイナリ自体で.dbファイルを調べて実行すると、バイナリはファイルを削除して正常に回復します。 sqlite3SELECT * 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
4

1 に答える 1

1

質問を読んでいるときに答えを見つけました...明らかに、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);

問題を修正します。テストアプリではなく、実際のプログラムでは、準備ステートメントから遠く離れたところに開いていたので、その特定のケースではREADONLYであることにさえ気づきませんでした。

于 2013-01-25T16:03:40.740 に答える