void Handle::registerCommittedHook(const CommittedHook &onCommitted, void *info) { m_committedHookInfo.onCommitted = onCommitted; m_committedHookInfo.info = info; m_committedHookInfo.handle = this; if (m_committedHookInfo.onCommitted) { sqlite3_wal_hook( (sqlite3 *) m_handle, [](void *p, sqlite3 *, const char *, int pages) -> int { CommittedHookInfo *committedHookInfo = (CommittedHookInfo *) p; committedHookInfo->onCommitted(committedHookInfo->handle, pages, committedHookInfo->info); return SQLITE_OK; }, &m_committedHookInfo); } else { sqlite3_wal_hook((sqlite3 *) m_handle, nullptr, nullptr); } }
ikptr ik_sqlite3_wal_hook (ikptr s_conn, ikptr s_callback, ikptr s_custom_data, ikpcb * pcb) { #ifdef HAVE_SQLITE3_WAL_HOOK typedef int cb_t (void *,sqlite3*,const char*,int); sqlite3 * conn = IK_SQLITE_CONNECTION(s_conn); cb_t * callback = IK_VOIDP_FROM_POINTER_OR_FALSE(s_custom_data); void * custom_data = IK_VOIDP_FROM_POINTER_OR_FALSE(s_custom_data); void * rv; rv = sqlite3_wal_hook(conn, callback, custom_data); return (rv)? ika_pointer_alloc(pcb, (ik_ulong)rv) : IK_FALSE; #else feature_failure(__func__); #endif }
static void checkpoint_starvation_main(int nMs, CheckpointStarvationCtx *p){ Error err = {0}; Sqlite db = {0}; Threadset threads = {0}; int nInsert = 0; int i; opendb(&err, &db, "test.db", 1); sql_script(&err, &db, "PRAGMA page_size = 1024;" "PRAGMA journal_mode = WAL;" "CREATE TABLE t1(x);" ); setstoptime(&err, nMs); for(i=0; i<4; i++){ launch_thread(&err, &threads, checkpoint_starvation_reader, 0); usleep(CHECKPOINT_STARVATION_READMS*1000/4); } sqlite3_wal_hook(db.db, checkpoint_starvation_walhook, (void *)p); while( !timetostop(&err) ){ sql_script(&err, &db, "INSERT INTO t1 VALUES(randomblob(1200))"); nInsert++; } printf(" Checkpoint mode : %s\n", p->eMode==SQLITE_CHECKPOINT_PASSIVE ? "PASSIVE" : "RESTART" ); printf(" Peak WAL : %d frames\n", p->nMaxFrame); printf(" Transaction count: %d transactions\n", nInsert); join_all_threads(&err, &threads); closedb(&err, &db); print_and_free_err(&err); }
bool SqliteDatabase::setupCheckpointing (JobQueue* q) { mWalQ = q; sqlite3_wal_hook (mConnection, SqliteWALHook, this); return true; }