github.com/jdgcs/sqlite3@v1.12.1-0.20210908114423-bc5f96e4dd51/testdata/tcl/tt3_vacuum.c (about) 1 /* 2 ** 2014 December 9 3 ** 4 ** The author disclaims copyright to this source code. In place of 5 ** a legal notice, here is a blessing: 6 ** 7 ** May you do good and not evil. 8 ** May you find forgiveness for yourself and forgive others. 9 ** May you share freely, never taking more than you give. 10 ** 11 ************************************************************************* 12 ** 13 ** This file contains multi-threaded tests that use shared-cache and 14 ** the VACUUM command. 15 ** 16 ** Tests: 17 ** 18 ** vacuum1 19 ** 20 */ 21 22 23 static char *vacuum1_thread_writer(int iTid, void *pArg){ 24 Error err = {0}; /* Error code and message */ 25 Sqlite db = {0}; /* SQLite database connection */ 26 opendb(&err, &db, "test.db", 0); 27 i64 i = 0; 28 29 while( !timetostop(&err) ){ 30 i++; 31 32 /* Insert lots of rows. Then delete some. */ 33 execsql(&err, &db, 34 "WITH loop(i) AS (SELECT 1 UNION ALL SELECT i+1 FROM loop WHERE i<100) " 35 "INSERT INTO t1 SELECT randomblob(50), randomblob(2500) FROM loop" 36 ); 37 38 /* Delete lots of rows */ 39 execsql(&err, &db, "DELETE FROM t1 WHERE rowid = :i", &i); 40 clear_error(&err, SQLITE_LOCKED); 41 42 /* Select the rows */ 43 execsql(&err, &db, "SELECT * FROM t1 ORDER BY x"); 44 clear_error(&err, SQLITE_LOCKED); 45 } 46 47 closedb(&err, &db); 48 print_and_free_err(&err); 49 return sqlite3_mprintf("ok"); 50 } 51 52 static char *vacuum1_thread_vacuumer(int iTid, void *pArg){ 53 Error err = {0}; /* Error code and message */ 54 Sqlite db = {0}; /* SQLite database connection */ 55 opendb(&err, &db, "test.db", 0); 56 57 do{ 58 sql_script(&err, &db, "VACUUM"); 59 clear_error(&err, SQLITE_LOCKED); 60 }while( !timetostop(&err) ); 61 62 closedb(&err, &db); 63 print_and_free_err(&err); 64 return sqlite3_mprintf("ok"); 65 } 66 67 static void vacuum1(int nMs){ 68 Error err = {0}; 69 Sqlite db = {0}; 70 Threadset threads = {0}; 71 72 opendb(&err, &db, "test.db", 1); 73 sql_script(&err, &db, 74 "CREATE TABLE t1(x PRIMARY KEY, y BLOB);" 75 "CREATE INDEX i1 ON t1(y);" 76 ); 77 closedb(&err, &db); 78 79 setstoptime(&err, nMs); 80 81 sqlite3_enable_shared_cache(1); 82 launch_thread(&err, &threads, vacuum1_thread_writer, 0); 83 launch_thread(&err, &threads, vacuum1_thread_writer, 0); 84 launch_thread(&err, &threads, vacuum1_thread_writer, 0); 85 launch_thread(&err, &threads, vacuum1_thread_vacuumer, 0); 86 join_all_threads(&err, &threads); 87 sqlite3_enable_shared_cache(0); 88 89 print_and_free_err(&err); 90 }