From fb5ce62532ca09acd6cddbd038dee283a3507dbb Mon Sep 17 00:00:00 2001 From: "Michael Bradley, Jr" Date: Fri, 8 Jul 2022 15:46:19 -0500 Subject: [PATCH] switch to `sqlite3_prepare_v3` and supply default `prepFlags` for long-lived prepared statements in datastore/sqlite_datastore.nim use `prepFlags = SQLITE_PREPARE_PERSISTENT` closes #13 --- datastore/sqlite.nim | 12 ++++++++---- datastore/sqlite_datastore.nim | 14 ++++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/datastore/sqlite.nim b/datastore/sqlite.nim index e4c8f63..a36e4d7 100644 --- a/datastore/sqlite.nim +++ b/datastore/sqlite.nim @@ -161,23 +161,27 @@ template open*( proc prepare*[Params, Res]( T: type SQLiteStmt[Params, Res], env: SQLite, - stmt: string): ?!T = + stmt: string, + prepFlags: cuint = 0): ?!T = var s: RawStmtPtr - checkErr sqlite3_prepare_v2(env, stmt.cstring, stmt.len.cint, addr s, nil) + checkErr sqlite3_prepare_v3( + env, stmt.cstring, stmt.len.cint, prepFlags, addr s, nil) success T(s) template prepare*( env: SQLite, - q: string): RawStmtPtr = + q: string, + prepFlags: cuint = 0): RawStmtPtr = var s: RawStmtPtr - checkErr sqlite3_prepare_v2(env, q.cstring, q.len.cint, addr s, nil) + checkErr sqlite3_prepare_v3( + env, q.cstring, q.len.cint, prepFlags, addr s, nil) s diff --git a/datastore/sqlite_datastore.nim b/datastore/sqlite_datastore.nim index 161fa56..9406fd1 100644 --- a/datastore/sqlite_datastore.nim +++ b/datastore/sqlite_datastore.nim @@ -227,11 +227,17 @@ proc new*( if not readOnly: checkExec(env.val, createStmtStr) - deleteStmt = ? DeleteStmt.prepare(env.val, deleteStmtStr) - putStmt = ? PutStmt.prepare(env.val, putStmtStr) + deleteStmt = ? DeleteStmt.prepare( + env.val, deleteStmtStr, SQLITE_PREPARE_PERSISTENT) - containsStmt = ? ContainsStmt.prepare(env.val, containsStmtStr) - getStmt = ? GetStmt.prepare(env.val, getStmtStr) + putStmt = ? PutStmt.prepare( + env.val, putStmtStr, SQLITE_PREPARE_PERSISTENT) + + containsStmt = ? ContainsStmt.prepare( + env.val, containsStmtStr, SQLITE_PREPARE_PERSISTENT) + + getStmt = ? GetStmt.prepare( + env.val, getStmtStr, SQLITE_PREPARE_PERSISTENT) # if a readOnly/existing database does not satisfy the expected schema # `pepare()` will fail and `new` will return an error with message