aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2017-12-06 02:23:53 +0100
committerNeels Hofmeyr <neels@hofmeyr.de>2017-12-19 23:52:34 +0100
commit6453d53377e6d3baaf264ad6be85ec600b4f1e37 (patch)
tree35634dcb4add2ea3ed7156ccf2e20c0542e48470
parent9baedafa244e19624a7c115f2fa8d5d96c657937 (diff)
db: wrap dbi querying to log actual SQL on debug and errorneels/dbi_debug
To be able to tell at all which DB query failed without introspecting the code in gdb or similar, wrap the database query functions in local shims that log the SQL. Related: OS#2667, OS#2706 Change-Id: I4171dad8ffffbf634a75dedde752d82c51ff7803
-rw-r--r--src/libmsc/db.c98
1 files changed, 64 insertions, 34 deletions
diff --git a/src/libmsc/db.c b/src/libmsc/db.c
index 0104bce..7f14bf7 100644
--- a/src/libmsc/db.c
+++ b/src/libmsc/db.c
@@ -188,6 +188,36 @@ static inline int next_row(dbi_result result)
return dbi_result_next_row(result);
}
+dbi_result query(dbi_conn conn, const char *sql)
+{
+ dbi_result result;
+
+ LOGP(DDB, LOGL_DEBUG, "Running query: %s\n", sql);
+ result = dbi_conn_query(conn, sql);
+
+ if (!result)
+ LOGP(DDB, LOGL_ERROR, "Failed to query: %s\n", sql);
+
+ return result;
+}
+
+dbi_result queryf(dbi_conn conn, const char *format, ...)
+{
+ va_list args;
+ char *sql;
+ dbi_result result;
+
+ va_start(args, format);
+ sql = talloc_vasprintf(NULL, format, args);
+ va_end(args);
+
+ result = query(conn, sql);
+
+ talloc_free(sql);
+
+ return result;
+}
+
void db_error_func(dbi_conn conn, void *data)
{
const char *msg;
@@ -200,7 +230,7 @@ static int update_db_revision_2(void)
{
dbi_result result;
- result = dbi_conn_query(conn,
+ result = query(conn,
"ALTER TABLE Subscriber "
"ADD COLUMN expire_lu "
"TIMESTAMP DEFAULT NULL");
@@ -211,7 +241,7 @@ static int update_db_revision_2(void)
}
dbi_result_free(result);
- result = dbi_conn_query(conn,
+ result = query(conn,
"UPDATE Meta "
"SET value = '3' "
"WHERE key = 'revision'");
@@ -252,7 +282,7 @@ static struct gsm_sms *sms_from_result_v3(dbi_result result)
snprintf(buf, sizeof(buf), "%llu", sender_id);
dbi_conn_quote_string_copy(conn, buf, &quoted);
- result2 = dbi_conn_queryf(conn,
+ result2 = queryf(conn,
"SELECT extension FROM Subscriber "
"WHERE id = %s ", quoted);
free(quoted);
@@ -292,7 +322,7 @@ static int update_db_revision_3(void)
LOGP(DDB, LOGL_NOTICE, "Going to migrate from revision 3\n");
- result = dbi_conn_query(conn, "BEGIN EXCLUSIVE TRANSACTION");
+ result = query(conn, "BEGIN EXCLUSIVE TRANSACTION");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to begin transaction (upgrade from rev 3)\n");
@@ -301,7 +331,7 @@ static int update_db_revision_3(void)
dbi_result_free(result);
/* Rename old SMS table to be able create a new one */
- result = dbi_conn_query(conn, "ALTER TABLE SMS RENAME TO SMS_3");
+ result = query(conn, "ALTER TABLE SMS RENAME TO SMS_3");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to rename the old SMS table (upgrade from rev 3).\n");
@@ -310,7 +340,7 @@ static int update_db_revision_3(void)
dbi_result_free(result);
/* Create new SMS table with all the bells and whistles! */
- result = dbi_conn_query(conn, create_stmts[SCHEMA_SMS]);
+ result = query(conn, create_stmts[SCHEMA_SMS]);
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to create a new SMS table (upgrade from rev 3).\n");
@@ -319,7 +349,7 @@ static int update_db_revision_3(void)
dbi_result_free(result);
/* Cycle through old messages and convert them to the new format */
- result = dbi_conn_query(conn, "SELECT * FROM SMS_3");
+ result = query(conn, "SELECT * FROM SMS_3");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed fetch messages from the old SMS table (upgrade from rev 3).\n");
@@ -338,7 +368,7 @@ static int update_db_revision_3(void)
dbi_result_free(result);
/* Remove the temporary table */
- result = dbi_conn_query(conn, "DROP TABLE SMS_3");
+ result = query(conn, "DROP TABLE SMS_3");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to drop the old SMS table (upgrade from rev 3).\n");
@@ -347,7 +377,7 @@ static int update_db_revision_3(void)
dbi_result_free(result);
/* We're done. Bump DB Meta revision to 4 */
- result = dbi_conn_query(conn,
+ result = query(conn,
"UPDATE Meta "
"SET value = '4' "
"WHERE key = 'revision'");
@@ -358,7 +388,7 @@ static int update_db_revision_3(void)
}
dbi_result_free(result);
- result = dbi_conn_query(conn, "COMMIT TRANSACTION");
+ result = query(conn, "COMMIT TRANSACTION");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to commit the transaction (upgrade from rev 3)\n");
@@ -368,7 +398,7 @@ static int update_db_revision_3(void)
}
/* Shrink DB file size by actually wiping out SMS_3 table data */
- result = dbi_conn_query(conn, "VACUUM");
+ result = query(conn, "VACUUM");
if (!result)
LOGP(DDB, LOGL_ERROR,
"VACUUM failed. Ignoring it (upgrade from rev 3).\n");
@@ -378,7 +408,7 @@ static int update_db_revision_3(void)
return 0;
rollback:
- result = dbi_conn_query(conn, "ROLLBACK TRANSACTION");
+ result = query(conn, "ROLLBACK TRANSACTION");
if (!result)
LOGP(DDB, LOGL_ERROR,
"Rollback failed (upgrade from rev 3).\n");
@@ -438,7 +468,7 @@ static int update_db_revision_4(void)
LOGP(DDB, LOGL_NOTICE, "Going to migrate from revision 4\n");
- result = dbi_conn_query(conn, "BEGIN EXCLUSIVE TRANSACTION");
+ result = query(conn, "BEGIN EXCLUSIVE TRANSACTION");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to begin transaction (upgrade from rev 4)\n");
@@ -447,7 +477,7 @@ static int update_db_revision_4(void)
dbi_result_free(result);
/* Rename old SMS table to be able create a new one */
- result = dbi_conn_query(conn, "ALTER TABLE SMS RENAME TO SMS_4");
+ result = query(conn, "ALTER TABLE SMS RENAME TO SMS_4");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to rename the old SMS table (upgrade from rev 4).\n");
@@ -456,7 +486,7 @@ static int update_db_revision_4(void)
dbi_result_free(result);
/* Create new SMS table with all the bells and whistles! */
- result = dbi_conn_query(conn, create_stmts[SCHEMA_SMS]);
+ result = query(conn, create_stmts[SCHEMA_SMS]);
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to create a new SMS table (upgrade from rev 4).\n");
@@ -465,7 +495,7 @@ static int update_db_revision_4(void)
dbi_result_free(result);
/* Cycle through old messages and convert them to the new format */
- result = dbi_conn_query(conn, "SELECT * FROM SMS_4");
+ result = query(conn, "SELECT * FROM SMS_4");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed fetch messages from the old SMS table (upgrade from rev 4).\n");
@@ -484,7 +514,7 @@ static int update_db_revision_4(void)
dbi_result_free(result);
/* Remove the temporary table */
- result = dbi_conn_query(conn, "DROP TABLE SMS_4");
+ result = query(conn, "DROP TABLE SMS_4");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to drop the old SMS table (upgrade from rev 4).\n");
@@ -493,7 +523,7 @@ static int update_db_revision_4(void)
dbi_result_free(result);
/* We're done. Bump DB Meta revision to 4 */
- result = dbi_conn_query(conn,
+ result = query(conn,
"UPDATE Meta "
"SET value = '5' "
"WHERE key = 'revision'");
@@ -504,7 +534,7 @@ static int update_db_revision_4(void)
}
dbi_result_free(result);
- result = dbi_conn_query(conn, "COMMIT TRANSACTION");
+ result = query(conn, "COMMIT TRANSACTION");
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to commit the transaction (upgrade from rev 4)\n");
@@ -514,7 +544,7 @@ static int update_db_revision_4(void)
}
/* Shrink DB file size by actually wiping out SMS_4 table data */
- result = dbi_conn_query(conn, "VACUUM");
+ result = query(conn, "VACUUM");
if (!result)
LOGP(DDB, LOGL_ERROR,
"VACUUM failed. Ignoring it (upgrade from rev 4).\n");
@@ -524,7 +554,7 @@ static int update_db_revision_4(void)
return 0;
rollback:
- result = dbi_conn_query(conn, "ROLLBACK TRANSACTION");
+ result = query(conn, "ROLLBACK TRANSACTION");
if (!result)
LOGP(DDB, LOGL_ERROR,
"Rollback failed (upgrade from rev 4).\n");
@@ -540,7 +570,7 @@ static int check_db_revision(void)
int db_rev = 0;
/* Make a query */
- result = dbi_conn_query(conn,
+ result = query(conn,
"SELECT value FROM Meta "
"WHERE key = 'revision'");
@@ -600,7 +630,7 @@ static int db_configure(void)
{
dbi_result result;
- result = dbi_conn_query(conn,
+ result = query(conn,
"PRAGMA synchronous = FULL");
if (!result)
return -EINVAL;
@@ -654,7 +684,7 @@ int db_prepare(void)
int i;
for (i = 0; i < ARRAY_SIZE(create_stmts); i++) {
- result = dbi_conn_query(conn, create_stmts[i]);
+ result = query(conn, create_stmts[i]);
if (!result) {
LOGP(DDB, LOGL_ERROR,
"Failed to create some table.\n");
@@ -701,7 +731,7 @@ int db_sms_store(struct gsm_sms *sms)
&q_udata);
/* FIXME: correct validity period */
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"INSERT INTO SMS "
"(created, valid_until, "
"reply_path_req, status_rep_req, is_report, "
@@ -789,7 +819,7 @@ struct gsm_sms *db_sms_get(struct gsm_network *net, unsigned long long id)
dbi_result result;
struct gsm_sms *sms;
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"SELECT * FROM SMS WHERE SMS.id = %llu", id);
if (!result)
return NULL;
@@ -813,7 +843,7 @@ struct gsm_sms *db_sms_get_next_unsent(struct gsm_network *net,
dbi_result result;
struct gsm_sms *sms;
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"SELECT * FROM SMS"
" WHERE sent IS NULL"
" AND id >= %llu"
@@ -853,7 +883,7 @@ struct gsm_sms *db_sms_get_unsent_for_subscr(struct vlr_subscr *vsub,
return NULL;
dbi_conn_quote_string_copy(conn, vsub->msisdn, &q_msisdn);
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"SELECT * FROM SMS"
" WHERE sent IS NULL"
" AND dest_addr = %s"
@@ -886,7 +916,7 @@ struct gsm_sms *db_sms_get_next_unsent_rr_msisdn(struct gsm_network *net,
char *q_last_msisdn;
dbi_conn_quote_string_copy(conn, last_msisdn, &q_last_msisdn);
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"SELECT * FROM SMS"
" WHERE sent IS NULL"
" AND dest_addr > %s"
@@ -915,7 +945,7 @@ int db_sms_mark_delivered(struct gsm_sms *sms)
{
dbi_result result;
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"UPDATE SMS "
"SET sent = datetime('now') "
"WHERE id = %llu", sms->id);
@@ -933,7 +963,7 @@ int db_sms_inc_deliver_attempts(struct gsm_sms *sms)
{
dbi_result result;
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"UPDATE SMS "
"SET deliver_attempts = deliver_attempts + 1 "
"WHERE id = %llu", sms->id);
@@ -956,7 +986,7 @@ int db_sms_delete_by_msisdn(const char *msisdn)
return 0;
dbi_conn_quote_string_copy(conn, msisdn, &q_msisdn);
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"DELETE FROM SMS WHERE src_addr=%s OR dest_addr=%s",
q_msisdn, q_msisdn);
free(q_msisdn);
@@ -977,7 +1007,7 @@ int db_store_counter(struct osmo_counter *ctr)
dbi_conn_quote_string_copy(conn, ctr->name, &q_name);
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"INSERT INTO Counters "
"(timestamp,name,value) VALUES "
"(datetime('now'),%s,%lu)", q_name, ctr->value);
@@ -1000,7 +1030,7 @@ static int db_store_rate_ctr(struct rate_ctr_group *ctrg, unsigned int num,
dbi_conn_quote_string_copy(conn, ctrg->desc->ctr_desc[num].name,
&q_name);
- result = dbi_conn_queryf(conn,
+ result = queryf(conn,
"Insert INTO RateCounters "
"(timestamp,name,idx,value) VALUES "
"(datetime('now'),%s.%s,%u,%"PRIu64")",