pmxcfs: db: tell query planner that prepared statement are long living
SQLITE_PREPARE_PERSISTENT
The SQLITE_PREPARE_PERSISTENT flag is a hint to the query planner
that the prepared statement will be retained for a long time and
probably reused many times. Without this flag,
sqlite3_prepare_v3() and sqlite3_prepare16_v3() assume that the
prepared statement will be used just once or at most a few times
and then destroyed using sqlite3_finalize() relatively soon. The
current implementation acts on this hint by avoiding the use of
lookaside memory so as not to deplete the limited store of
lookaside memory. Future versions of SQLite may act on this hint
differently.
-- https://sqlite.org/c3ref/c_prepare_normalize.html#sqlitepreparepersistent
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
c44bb3d626
commit
4942611503
1 changed files with 12 additions and 8 deletions
|
|
@ -679,49 +679,53 @@ db_backend_t *bdb_backend_open(
|
|||
if (!(bdb->db = bdb_create(filename)))
|
||||
goto fail;
|
||||
|
||||
rc = sqlite3_prepare_v2(bdb->db, sql_insert_entry, -1, &bdb->stmt_insert_entry, NULL);
|
||||
// tell the query planner that the prepared statement will be retained for a long time and
|
||||
// probably reused many times
|
||||
const unsigned int flags = SQLITE_PREPARE_PERSISTENT;
|
||||
|
||||
rc = sqlite3_prepare_v3(bdb->db, sql_insert_entry, -1, flags, &bdb->stmt_insert_entry, NULL);
|
||||
if (rc != SQLITE_OK) {
|
||||
cfs_critical("sqlite3_prepare 'sql_insert_entry' failed: %s\n",
|
||||
sqlite3_errmsg(bdb->db));
|
||||
goto fail;
|
||||
}
|
||||
rc = sqlite3_prepare_v2(bdb->db, sql_update_entry, -1, &bdb->stmt_update_entry, NULL);
|
||||
rc = sqlite3_prepare_v3(bdb->db, sql_update_entry, -1, flags, &bdb->stmt_update_entry, NULL);
|
||||
if (rc != SQLITE_OK) {
|
||||
cfs_critical("sqlite3_prepare 'sql_update_entry' failed: %s\n",
|
||||
sqlite3_errmsg(bdb->db));
|
||||
goto fail;
|
||||
}
|
||||
rc = sqlite3_prepare_v2(bdb->db, sql_replace_entry, -1, &bdb->stmt_replace_entry, NULL);
|
||||
rc = sqlite3_prepare_v3(bdb->db, sql_replace_entry, -1, flags, &bdb->stmt_replace_entry, NULL);
|
||||
if (rc != SQLITE_OK) {
|
||||
cfs_critical("sqlite3_prepare 'sql_replace_entry' failed: %s\n",
|
||||
sqlite3_errmsg(bdb->db));
|
||||
goto fail;
|
||||
}
|
||||
rc = sqlite3_prepare_v2(bdb->db, sql_delete_entry, -1, &bdb->stmt_delete_entry, NULL);
|
||||
rc = sqlite3_prepare_v3(bdb->db, sql_delete_entry, -1, flags, &bdb->stmt_delete_entry, NULL);
|
||||
if (rc != SQLITE_OK) {
|
||||
cfs_critical("sqlite3_prepare 'sql_delete_entry' failed: %s\n",
|
||||
sqlite3_errmsg(bdb->db));
|
||||
goto fail;
|
||||
}
|
||||
rc = sqlite3_prepare_v2(bdb->db, sql_begin, -1, &bdb->stmt_begin, NULL);
|
||||
rc = sqlite3_prepare_v3(bdb->db, sql_begin, -1, flags, &bdb->stmt_begin, NULL);
|
||||
if (rc != SQLITE_OK) {
|
||||
cfs_critical("sqlite3_prepare 'sql_begin' failed: %s\n",
|
||||
sqlite3_errmsg(bdb->db));
|
||||
goto fail;
|
||||
}
|
||||
rc = sqlite3_prepare_v2(bdb->db, sql_commit, -1, &bdb->stmt_commit, NULL);
|
||||
rc = sqlite3_prepare_v3(bdb->db, sql_commit, -1, flags, &bdb->stmt_commit, NULL);
|
||||
if (rc != SQLITE_OK) {
|
||||
cfs_critical("sqlite3_prepare 'sql_commit' failed: %s\n",
|
||||
sqlite3_errmsg(bdb->db));
|
||||
goto fail;
|
||||
}
|
||||
rc = sqlite3_prepare_v2(bdb->db, sql_rollback, -1, &bdb->stmt_rollback, NULL);
|
||||
rc = sqlite3_prepare_v3(bdb->db, sql_rollback, -1, flags, &bdb->stmt_rollback, NULL);
|
||||
if (rc != SQLITE_OK) {
|
||||
cfs_critical("sqlite3_prepare 'sql_rollback' failed: %s\n",
|
||||
sqlite3_errmsg(bdb->db));
|
||||
goto fail;
|
||||
}
|
||||
rc = sqlite3_prepare_v2(bdb->db, sql_load_all, -1, &bdb->stmt_load_all, NULL);
|
||||
rc = sqlite3_prepare_v3(bdb->db, sql_load_all, -1, flags, &bdb->stmt_load_all, NULL);
|
||||
if (rc != SQLITE_OK) {
|
||||
cfs_critical("sqlite3_prepare 'sql_load_all' failed: %s\n",
|
||||
sqlite3_errmsg(bdb->db));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue