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
.