sqlite3 one_file VFS échoue

J’essayais d’exécuter test_onefile.c exemple à partir d’ exemples sqlite3 VFS , et j’obtiens l’échec suivant:

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

Je lance le code comme suit:

 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); 

Edit: le fichier sur sampledb.sqlite2-wal il échoue est sampledb.sqlite2-wal , ce n’est clairement pas un fichier journal. Cependant, je ne comprends pas comment cela a abouti.

Edit2: Eh bien, après avoir supprimé l’assertion dans le fichier source:

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

Le code semble fonctionner. Cependant, je ne suis pas un grand partisan de la suppression des assertions, car cela conduirait clairement à un comportement inattendu. L’auteur avait une raison d’utiliser l’affirmation.

Le VFS implémenté par test_onefile.c est assez ancien et ne prend donc pas en charge les fichiers supplémentaires requirejs pour le mode WAL.

Pour que cela fonctionne avec un SQLite moderne, la fonction fsDelete doit simplement ignorer les tentatives de suppression de fichiers -wal ou -shm .