summaryrefslogtreecommitdiff
path: root/main/db.c
diff options
context:
space:
mode:
authorMichael L. Young <elgueromexicano@gmail.com>2014-07-22 18:56:00 +0000
committerMichael L. Young <elgueromexicano@gmail.com>2014-07-22 18:56:00 +0000
commitb4a681684d2fee800add540ede399bf45915fe49 (patch)
tree7435cab7ec150c952f79206e43fc4a10d016ef5d /main/db.c
parent197f06bed16cf1babf18a1c611b99ff98aa559e4 (diff)
core/db: Improve I/O When Updating Rows
When updating a row, we are currently doing an INSERT OR REPLACE INTO. The downside to this is that the row is deleted if it exists and then a new row is inserted. So, we are hitting the disk twice. One for the deletion and one for the insertion. This patch changes this statement to an INSERT INTO and if the insert fails because a row with that key exists, we will IGNORE the failure. Then we will attempt to perform an UPDATE on the existing row if that row wasn't just INSERTed. ASTERISK-24050 #close Reported by: Michael L. Young patches: astdb-insert-update-io-help_trunk_v2.diff uploaded by Michael L. Young (license 5026) Review: https://reviewboard.asterisk.org/r/3815/ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@419222 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/db.c')
-rw-r--r--main/db.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/main/db.c b/main/db.c
index 5a0f17434..80af29f75 100644
--- a/main/db.c
+++ b/main/db.c
@@ -119,7 +119,7 @@ static void db_sync(void);
#define DEFINE_SQL_STATEMENT(stmt,sql) static sqlite3_stmt *stmt; \
const char stmt##_sql[] = sql;
-DEFINE_SQL_STATEMENT(put_stmt, "INSERT OR REPLACE INTO astdb (key, value) VALUES (?, ?)")
+DEFINE_SQL_STATEMENT(put_stmt, "INSERT OR IGNORE INTO astdb (key, value) VALUES (?1, ?2); UPDATE astdb SET value=?2 WHERE changes()=0 AND key=?1")
DEFINE_SQL_STATEMENT(get_stmt, "SELECT value FROM astdb WHERE key=?")
DEFINE_SQL_STATEMENT(del_stmt, "DELETE FROM astdb WHERE key=?")
DEFINE_SQL_STATEMENT(deltree_stmt, "DELETE FROM astdb WHERE key || '/' LIKE ? || '/' || '%'")