Signed-off-by: Max max.suraev@fairwaves.co --- openbsc/src/libmsc/db.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 428f99b..035202d 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -301,7 +301,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_queryf(conn, "SELECT * FROM SMS_3"); + result = dbi_conn_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"); @@ -1095,8 +1095,8 @@ int db_subscriber_list_active(void (*cb)(struct gsm_subscriber*,void*), void *cl { dbi_result result;
- result = dbi_conn_queryf(conn, - "SELECT * from Subscriber WHERE LAC != 0 AND authorized = 1"); + result = dbi_conn_query(conn, + "SELECT * from Subscriber WHERE LAC != 0 AND authorized = 1"); if (!result) { LOGP(DDB, LOGL_ERROR, "Failed to list active subscribers\n"); return -1;
Signed-off-by: Max max.suraev@fairwaves.co --- debian/control | 2 +- openbsc/configure.ac | 1 + openbsc/src/libmsc/db.c | 7 ++++--- 3 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/debian/control b/debian/control index ad0cc89..af305f9 100644 --- a/debian/control +++ b/debian/control @@ -2,7 +2,7 @@ Source: openbsc Section: net Priority: optional Maintainer: Harald Welte laforge@gnumonks.org -Build-Depends: debhelper (>= 7.0.0~), autotools-dev, pkg-config, libgtp0-dev, libosmocore-dev, libosmo-sccp-dev, libdbi0-dev, dh-autoreconf, libosmo-abis-dev, libosmo-netif-dev, libdbd-sqlite3, libpcap-dev +Build-Depends: debhelper (>= 7.0.0~), autotools-dev, pkg-config, libgtp0-dev, libosmocore-dev, libosmo-sccp-dev, libdbi-dev (>= 0.9.0), dh-autoreconf, libosmo-abis-dev, libosmo-netif-dev, libdbd-sqlite3, libpcap-dev Standards-Version: 3.8.4 Homepage: http://openbsc.osmocom.org/ Vcs-Git: git://bs11-abis.gnumonks.org/openbsc.git diff --git a/openbsc/configure.ac b/openbsc/configure.ac index 0ebb041..c07467e 100644 --- a/openbsc/configure.ac +++ b/openbsc/configure.ac @@ -27,6 +27,7 @@ PKG_CHECK_MODULES(LIBOSMOGSM, libosmogsm >= 0.7.0) PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 0.2.0) PKG_CHECK_MODULES(LIBOSMOGB, libosmogb >= 0.6.4) PKG_CHECK_MODULES(LIBOSMONETIF, libosmo-netif >= 0.0.1) +PKG_CHECK_MODULES(LIBDBI, dbi >= 0.9.0)
# Enabke/disable the NAT? AC_ARG_ENABLE([nat], [AS_HELP_STRING([--enable-nat], [Build the BSC NAT. Requires SCCP])], diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 035202d..9b0ce43 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -44,6 +44,7 @@ void subscr_direct_free(struct gsm_subscriber *subscr); static char *db_basename = NULL; static char *db_dirname = NULL; static dbi_conn conn; +static dbi_inst dbi_instance = 0;
#define SCHEMA_REVISION "4"
@@ -425,9 +426,9 @@ static int db_configure(void)
int db_init(const char *name) { - dbi_initialize(NULL); + dbi_initialize_r(NULL, &dbi_instance);
- conn = dbi_conn_new("sqlite3"); + conn = dbi_conn_new_r("sqlite3", dbi_instance); if (conn == NULL) { LOGP(DDB, LOGL_FATAL, "Failed to create connection.\n"); return 1; @@ -491,7 +492,7 @@ int db_prepare(void) int db_fini(void) { dbi_conn_close(conn); - dbi_shutdown(); + dbi_shutdown_r(dbi_instance);
free(db_dirname); free(db_basename);
Signed-off-by: Max max.suraev@fairwaves.co --- openbsc/include/openbsc/debug.h | 1 + openbsc/src/libcommon/debug.c | 5 +++ openbsc/src/libmsc/db.c | 97 ++++++++++++++++++++++------------------- 3 files changed, 58 insertions(+), 45 deletions(-)
diff --git a/openbsc/include/openbsc/debug.h b/openbsc/include/openbsc/debug.h index 19d8fc2..658483a 100644 --- a/openbsc/include/openbsc/debug.h +++ b/openbsc/include/openbsc/debug.h @@ -23,6 +23,7 @@ enum { DMGCP, DHO, DDB, + DSQL, DREF, DGPRS, DNS, diff --git a/openbsc/src/libcommon/debug.c b/openbsc/src/libcommon/debug.c index 7fb3ecb..00a9476 100644 --- a/openbsc/src/libcommon/debug.c +++ b/openbsc/src/libcommon/debug.c @@ -115,6 +115,11 @@ static const struct log_info_cat default_categories[] = { .description = "Database Layer", .enabled = 1, .loglevel = LOGL_NOTICE, }, + [DSQL] = { + .name = "DSQL", + .description = "SQL Queries Tracing", + .enabled = 0, .loglevel = LOGL_DEBUG, + }, [DREF] = { .name = "DREF", .description = "Reference Counting", diff --git a/openbsc/src/libmsc/db.c b/openbsc/src/libmsc/db.c index 9b0ce43..d544ec4 100644 --- a/openbsc/src/libmsc/db.c +++ b/openbsc/src/libmsc/db.c @@ -185,6 +185,13 @@ void db_error_func(dbi_conn conn, void *data) osmo_log_backtrace(DDB, LOGL_ERROR); }
+/* Use macro instead of vararg function because recursive vararg use is impossible. + ##__VA_ARGS__ extension is not used in order to catch useless calls to dbi_conn_queryf() + instead of dbi_conn_query() +*/ +#define trace_dbi_conn_queryf(c, f, ...) \ + dbi_conn_queryf(c, f, __VA_ARGS__); do { LOGP(DSQL, LOGL_DEBUG, f "\n", __VA_ARGS__); } while(0) + static int update_db_revision_2(void) { dbi_result result; @@ -507,7 +514,7 @@ struct gsm_subscriber *db_create_subscriber(const char *imsi) /* Is this subscriber known in the db? */ subscr = db_get_subscriber(GSM_SUBSCRIBER_IMSI, imsi); if (subscr) { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE Subscriber set updated = datetime('now') " "WHERE imsi = %s " , imsi); if (!result) @@ -521,7 +528,7 @@ struct gsm_subscriber *db_create_subscriber(const char *imsi) if (!subscr) return NULL; subscr->flags |= GSM_SUBSCRIBER_FIRST_CONTACT; - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "INSERT INTO Subscriber " "(imsi, created, updated) " "VALUES " @@ -548,7 +555,7 @@ static int get_equipment_by_subscr(struct gsm_subscriber *subscr) const unsigned char *cm2, *cm3; struct gsm_equipment *equip = &subscr->equipment;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT Equipment.* " "FROM Equipment JOIN EquipmentWatch ON " "EquipmentWatch.equipment_id=Equipment.id " @@ -597,7 +604,7 @@ int db_get_authinfo_for_subscr(struct gsm_auth_info *ainfo, dbi_result result; const unsigned char *a3a8_ki;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT * FROM AuthKeys WHERE subscriber_id=%llu", subscr->id); if (!result) @@ -630,7 +637,7 @@ int db_sync_authinfo_for_subscr(struct gsm_auth_info *ainfo,
/* Deletion ? */ if (ainfo == NULL) { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM AuthKeys WHERE subscriber_id=%llu", subscr->id);
@@ -653,13 +660,13 @@ int db_sync_authinfo_for_subscr(struct gsm_auth_info *ainfo, ainfo->a3a8_ki, ainfo->a3a8_ki_len, &ki_str);
if (!upd) { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "INSERT INTO AuthKeys " "(subscriber_id, algorithm_id, a3a8_ki) " "VALUES (%llu, %u, %s)", subscr->id, ainfo->auth_algo, ki_str); } else { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE AuthKeys " "SET algorithm_id=%u, a3a8_ki=%s " "WHERE subscriber_id=%llu", @@ -683,7 +690,7 @@ int db_get_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple, int len; const unsigned char *blob;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT * FROM AuthLastTuples WHERE subscriber_id=%llu", subscr->id); if (!result) @@ -739,7 +746,7 @@ int db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple,
/* Deletion ? */ if (atuple == NULL) { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM AuthLastTuples WHERE subscriber_id=%llu", subscr->id);
@@ -766,7 +773,7 @@ int db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple, atuple->kc, sizeof(atuple->kc), &kc_str);
if (!upd) { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "INSERT INTO AuthLastTuples " "(subscriber_id, issued, use_count, " "key_seq, rand, sres, kc) " @@ -777,7 +784,7 @@ int db_sync_lastauthtuple_for_subscr(struct gsm_auth_tuple *atuple, } else { char *issued = atuple->key_seq == atuple_old.key_seq ? "issued" : "datetime('now')"; - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE AuthLastTuples " "SET issued=%s, use_count=%u, " "key_seq=%u, rand=%s, sres=%s, kc=%s " @@ -839,7 +846,7 @@ struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, switch (field) { case GSM_SUBSCRIBER_IMSI: dbi_conn_quote_string_copy(conn, id, "ed); - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, BASE_QUERY "WHERE imsi = %s ", quoted @@ -848,7 +855,7 @@ struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, break; case GSM_SUBSCRIBER_TMSI: dbi_conn_quote_string_copy(conn, id, "ed); - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, BASE_QUERY "WHERE tmsi = %s ", quoted @@ -857,7 +864,7 @@ struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, break; case GSM_SUBSCRIBER_EXTENSION: dbi_conn_quote_string_copy(conn, id, "ed); - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, BASE_QUERY "WHERE extension = %s ", quoted @@ -866,7 +873,7 @@ struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field, break; case GSM_SUBSCRIBER_ID: dbi_conn_quote_string_copy(conn, id, "ed); - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, BASE_QUERY "WHERE id = %s ", quoted); free(quoted); @@ -907,7 +914,7 @@ int db_subscriber_update(struct gsm_subscriber *subscr)
/* Copy the id to a string as queryf with %llu is failing */ sprintf(buf, "%llu", subscr->id); - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, BASE_QUERY "WHERE id = %s", buf);
@@ -949,7 +956,7 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) q_tmsi = strdup("NULL");
if (subscriber->expire_lu == GSM_SUBSCRIBER_NO_EXPIRATION) { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE Subscriber " "SET updated = datetime('now'), " "name = %s, " @@ -966,7 +973,7 @@ int db_sync_subscriber(struct gsm_subscriber *subscriber) subscriber->lac, subscriber->imsi); } else { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE Subscriber " "SET updated = datetime('now'), " "name = %s, " @@ -1003,7 +1010,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) { dbi_result result;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM AuthKeys WHERE subscriber_id=%llu", subscr->id); if (!result) { @@ -1013,7 +1020,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM AuthLastTuples WHERE subscriber_id=%llu", subscr->id); if (!result) { @@ -1023,7 +1030,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM AuthToken WHERE subscriber_id=%llu", subscr->id); if (!result) { @@ -1033,7 +1040,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM EquipmentWatch WHERE subscriber_id=%llu", subscr->id); if (!result) { @@ -1043,7 +1050,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM SMS WHERE src_addr=%s OR dest_addr=%s", subscr->extension, subscr->extension); if (!result) { @@ -1053,7 +1060,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM VLR WHERE subscriber_id=%llu", subscr->id); if (!result) { @@ -1063,7 +1070,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM ApduBlobs WHERE subscriber_id=%llu", subscr->id); if (!result) { @@ -1073,7 +1080,7 @@ int db_subscriber_delete(struct gsm_subscriber *subscr) } dbi_result_free(result);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "DELETE FROM Subscriber WHERE id=%llu", subscr->id); if (!result) { @@ -1143,7 +1150,7 @@ int db_sync_equipment(struct gsm_equipment *equip) equip->classmark3_len, &cm3); dbi_conn_quote_string_copy(conn, equip->imei, &q_imei);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE Equipment SET " "updated = datetime('now'), " "classmark1 = %u, " @@ -1201,7 +1208,7 @@ int db_subscriber_alloc_tmsi(struct gsm_subscriber *subscriber)
sprintf(tmsi, "%u", subscriber->tmsi); dbi_conn_quote_string_copy(conn, tmsi, &tmsi_quoted); - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT * FROM Subscriber " "WHERE tmsi = %s ", tmsi_quoted); @@ -1235,7 +1242,7 @@ int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber)
for (;;) { try = (rand()%(GSM_MAX_EXTEN-GSM_MIN_EXTEN+1)+GSM_MIN_EXTEN); - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT * FROM Subscriber " "WHERE extension = %i", try @@ -1274,7 +1281,7 @@ int db_subscriber_alloc_token(struct gsm_subscriber *subscriber, uint32_t *token try = rand(); if (!try) /* 0 is an invalid token */ continue; - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT * FROM AuthToken " "WHERE subscriber_id = %llu OR token = "%08X" ", subscriber->id, try); @@ -1293,7 +1300,7 @@ int db_subscriber_alloc_token(struct gsm_subscriber *subscriber, uint32_t *token } dbi_result_free(result); } - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "INSERT INTO AuthToken " "(subscriber_id, created, token) " "VALUES " @@ -1319,7 +1326,7 @@ int db_subscriber_assoc_imei(struct gsm_subscriber *subscriber, char imei[GSM_IM strncpy(subscriber->equipment.imei, imei, sizeof(subscriber->equipment.imei)-1);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "INSERT OR IGNORE INTO Equipment " "(imei, created, updated) " "VALUES " @@ -1339,7 +1346,7 @@ int db_subscriber_assoc_imei(struct gsm_subscriber *subscriber, char imei[GSM_IM if (equipment_id) DEBUGP(DDB, "New Equipment: ID %llu, IMEI %s\n", equipment_id, imei); else { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT id FROM Equipment " "WHERE imei = %s ", imei @@ -1357,7 +1364,7 @@ int db_subscriber_assoc_imei(struct gsm_subscriber *subscriber, char imei[GSM_IM dbi_result_free(result); }
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "INSERT OR IGNORE INTO EquipmentWatch " "(subscriber_id, equipment_id, created, updated) " "VALUES " @@ -1377,7 +1384,7 @@ int db_subscriber_assoc_imei(struct gsm_subscriber *subscriber, char imei[GSM_IM DEBUGP(DDB, "New EquipmentWatch: ID %llu, IMSI %s, IMEI %s\n", equipment_id, subscriber->imsi, imei); else { - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE EquipmentWatch " "SET updated = datetime('now') " "WHERE subscriber_id = %llu AND equipment_id = %llu ", @@ -1411,7 +1418,7 @@ int db_sms_store(struct gsm_sms *sms) &q_udata);
/* FIXME: correct validity period */ - result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "INSERT INTO SMS " "(created, valid_until, " "reply_path_req, status_rep_req, protocol_id, " @@ -1500,7 +1507,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 = trace_dbi_conn_queryf(conn, "SELECT * FROM SMS WHERE SMS.id = %llu", id); if (!result) return NULL; @@ -1523,7 +1530,7 @@ struct gsm_sms *db_sms_get_unsent(struct gsm_network *net, unsigned long long mi dbi_result result; struct gsm_sms *sms;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT SMS.* " "FROM SMS JOIN Subscriber ON " "SMS.dest_addr = Subscriber.extension " @@ -1553,7 +1560,7 @@ struct gsm_sms *db_sms_get_unsent_by_subscr(struct gsm_network *net, dbi_result result; struct gsm_sms *sms;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT SMS.* " "FROM SMS JOIN Subscriber ON " "SMS.dest_addr = Subscriber.extension " @@ -1582,7 +1589,7 @@ struct gsm_sms *db_sms_get_unsent_for_subscr(struct gsm_subscriber *subscr) dbi_result result; struct gsm_sms *sms;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "SELECT SMS.* " "FROM SMS JOIN Subscriber ON " "SMS.dest_addr = Subscriber.extension " @@ -1610,7 +1617,7 @@ int db_sms_mark_delivered(struct gsm_sms *sms) { dbi_result result;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE SMS " "SET sent = datetime('now') " "WHERE id = %llu", sms->id); @@ -1628,7 +1635,7 @@ int db_sms_inc_deliver_attempts(struct gsm_sms *sms) { dbi_result result;
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "UPDATE SMS " "SET deliver_attempts = deliver_attempts + 1 " "WHERE id = %llu", sms->id); @@ -1651,7 +1658,7 @@ int db_apdu_blob_store(struct gsm_subscriber *subscr,
dbi_conn_quote_binary_copy(conn, apdu, len, &q_apdu);
- result = dbi_conn_queryf(conn, + result = trace_dbi_conn_queryf(conn, "INSERT INTO ApduBlobs " "(created,subscriber_id,apdu_id_flags,apdu) VALUES " "(datetime('now'),%llu,%u,%s)", @@ -1673,7 +1680,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 = trace_dbi_conn_queryf(conn, "INSERT INTO Counters " "(timestamp,name,value) VALUES " "(datetime('now'),%s,%lu)", q_name, ctr->value); @@ -1696,7 +1703,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 = trace_dbi_conn_queryf(conn, "Insert INTO RateCounters " "(timestamp,name,idx,value) VALUES " "(datetime('now'),%s.%s,%u,%"PRIu64")",
This patch series switch to thread-safe interface of libdbi (correspondingly introducing version requirement for libdbi >= 0.9.0). In addition SQL-specific debug facility is added alongside with couple of inefficiencies catch.
Essentially it's groundwork for possible future refactoring which allows for things like gprs authentication or prepared statements to be implemented.
On 29 Jul 2015, at 20:25, ☎ Max.Suraev@fairwaves.co wrote:
This patch series switch to thread-safe interface of libdbi (correspondingly introducing version requirement for libdbi >= 0.9.0). In addition SQL-specific debug facility is added alongside with couple of inefficiencies catch.
libdbi >= 0.9.0 has severe memory corruptions[1] and they remain unfixed. We should just move away from it and not force the usage of a broken version.
holger
[1] http://sourceforge.net/p/libdbi/mailman/message/32607036/