2014-01-22 5 views
1

Я пытался запустить test_onefile.c пример из sqlite3 VFS examples, и я получаю отказ:sqlite3 one_file VFS Сбой

test_onefile: test_onefile.c:693: fsDelete: Assertion `strpcmp("-journal", &zPath[nName])==0' failed. 

Я бегу код следующим образом:

int retval; 
fs_register(); 
int q_cnt = 5,q_size = 150,ind = 0; 
char **queries = (char**) malloc(sizeof(char) * q_cnt * q_size); 


sqlite3_stmt *stmt; 
sqlite3 *handle; 

retval = sqlite3_open_v2("sampledb.sqlite2", &handle, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE , "fs");  


    if(retval) 
    { 
     printf("Database connection failed\n"); 
     return -1; 
    } 
    printf("Connection successful\n"); 

    // Create the SQL query for creating a table 
    char create_table[100] = "CREATE TABLE IF NOT EXISTS users (uname TEXT,pass TEXT NOT NULL,activated INTEGER)"; 

    // Execute the query for creating the table 
    retval = sqlite3_exec(handle,create_table,0,0,0); 

    // Insert first row and second row 
    queries[ind++] = "INSERT INTO users VALUES('manish','mani',1)"; 
    retval = sqlite3_exec(handle,queries[ind-1],0,0,0); 
    queries[ind++] = "INSERT INTO users VALUES('mehul','pulsar',0)"; 
    retval = sqlite3_exec(handle,queries[ind-1],0,0,0); 

Редактировать : Файл, с которым он не работает, - sampledb.sqlite2-wal, явно не файл журнала. Однако я не понимаю, как он достиг этого.

Edit2: Ну, после удаления утверждения в исходном файле:

assert(strcmp("-journal", &zPath[nName])==0);

код, кажется, работает. Однако я не большой поклонник удаления утверждений, так как это явно привело к неожиданному поведению. У автора была причина использовать это утверждение.

+0

Возможно, это дает вам утверждение о том, что ваше сравнение терпит неудачу (не соответствует двум строкам). поэтому он прерывает выполнение с этой точки. –

+0

Нет. Точный код работает с VFS по умолчанию и демонстрационной VFS. Это не удается в утверждении, потому что он пытается удалить файл '-wal'. – Mattan

ответ

1

VFS, реализованный test_onefile.c, довольно старый и, следовательно, не поддерживает дополнительные файлы, необходимые для режима WAL.

Чтобы заставить его работать с современным SQLite, функция fsDelete должна просто игнорировать попытки удалить файлы -wal или -shm.

+0

Есть ли способ отключить режим wal из C api? Я был уверен, что по умолчанию режим «WAL» отключен. Мне хорошо, что у меня есть только файлы журналов. Я сделал изменения в 'test_onefile.c', чтобы читать/записывать напрямую на необработанное устройство (при условии, что один db на раздел), без использования базовых vfs (который использует вызовы fs). Пока, без утверждения, он работает нормально. Тем не менее, я чувствую, что эти файлы ('wal',' shm') будут каким-то образом вызывать ошибки. – Mattan

+1

Проблема не в том, что режим WAL включен, но что новый SQLite пытается удалить файлы WAL, чтобы быть уверенным. –

Смежные вопросы