diff options
author | Harald Welte (local) <laflocal@hanuman.gnumonks.org> | 2009-08-17 09:39:55 +0200 |
---|---|---|
committer | Harald Welte (local) <laflocal@hanuman.gnumonks.org> | 2009-08-17 09:39:55 +0200 |
commit | ee4410a4f312d927dc8b4901c71c52436c18ca4a (patch) | |
tree | ef1fe06efb62355c9a9e22dafd2ec9b75cf72e68 /openbsc/src/db.c | |
parent | b8afe81e96a5b3ce3681482b8484788fbeb921d9 (diff) |
actual code running at end of har2009
Diffstat (limited to 'openbsc/src/db.c')
-rw-r--r-- | openbsc/src/db.c | 69 |
1 files changed, 65 insertions, 4 deletions
diff --git a/openbsc/src/db.c b/openbsc/src/db.c index 16a7f6ad7..45e950b6f 100644 --- a/openbsc/src/db.c +++ b/openbsc/src/db.c @@ -24,6 +24,7 @@ #include <openbsc/gsm_04_11.h> #include <openbsc/db.h> #include <openbsc/talloc.h> +#include <openbsc/debug.h> #include <libgen.h> #include <stdio.h> @@ -260,6 +261,53 @@ struct gsm_subscriber* db_create_subscriber(struct gsm_network *net, char *imsi) return subscr; } +static int get_equipment_by_subscr(struct gsm_subscriber *subscr) +{ + dbi_result result; + char *string; + unsigned int cm1; + const unsigned char *cm2, *cm3; + struct gsm_equipment *equip = &subscr->equipment; + + result = dbi_conn_queryf(conn, + "SELECT equipment.* FROM equipment,equipmentwatch " + "WHERE equipmentwatch.equipment_id=equipment.id " + "AND equipmentwatch.subscriber_id = %llu " + "ORDER BY updated DESC", subscr->id); + if (!result) + return -EIO; + + if (!dbi_result_next_row(result)) { + dbi_result_free(result); + return -ENOENT; + } + + equip->id = dbi_result_get_ulonglong(result, "id"); + + string = dbi_result_get_string(result, "imei"); + if (string) + strncpy(equip->imei, string, sizeof(equip->imei)); + + cm1 = dbi_result_get_uint(result, "classmark1") & 0xff; + equip->classmark1 = *((struct gsm48_classmark1 *) &cm1); + + equip->classmark2_len = dbi_result_get_field_length(result, "classmark2"); + cm2 = dbi_result_get_binary(result, "classmark2"); + if (equip->classmark2_len > sizeof(equip->classmark2)) + equip->classmark2_len = sizeof(equip->classmark2); + memcpy(equip->classmark2, cm2, equip->classmark2_len); + + equip->classmark3_len = dbi_result_get_field_length(result, "classmark3"); + cm3 = dbi_result_get_binary(result, "classmark3"); + if (equip->classmark3_len > sizeof(equip->classmark3)) + equip->classmark3_len = sizeof(equip->classmark3); + memcpy(equip->classmark3, cm3, equip->classmark3_len); + + dbi_result_free(result); + + return 0; +} +#define BASE_QUERY "SELECT * FROM Subscriber " struct gsm_subscriber *db_get_subscriber(struct gsm_network *net, enum gsm_subscriber_field field, const char *id) @@ -273,7 +321,7 @@ struct gsm_subscriber *db_get_subscriber(struct gsm_network *net, case GSM_SUBSCRIBER_IMSI: dbi_conn_quote_string_copy(conn, id, "ed); result = dbi_conn_queryf(conn, - "SELECT * FROM Subscriber " + BASE_QUERY "WHERE imsi = %s ", quoted ); @@ -282,7 +330,7 @@ struct gsm_subscriber *db_get_subscriber(struct gsm_network *net, case GSM_SUBSCRIBER_TMSI: dbi_conn_quote_string_copy(conn, id, "ed); result = dbi_conn_queryf(conn, - "SELECT * FROM Subscriber " + BASE_QUERY "WHERE tmsi = %s ", quoted ); @@ -291,7 +339,7 @@ struct gsm_subscriber *db_get_subscriber(struct gsm_network *net, case GSM_SUBSCRIBER_EXTENSION: dbi_conn_quote_string_copy(conn, id, "ed); result = dbi_conn_queryf(conn, - "SELECT * FROM Subscriber " + BASE_QUERY "WHERE extension = %s ", quoted ); @@ -300,7 +348,7 @@ struct gsm_subscriber *db_get_subscriber(struct gsm_network *net, case GSM_SUBSCRIBER_ID: dbi_conn_quote_string_copy(conn, id, "ed); result = dbi_conn_queryf(conn, - "SELECT * FROM Subscriber " + BASE_QUERY "WHERE id = %s ", quoted); free(quoted); break; @@ -344,6 +392,9 @@ struct gsm_subscriber *db_get_subscriber(struct gsm_network *net, subscr->id, subscr->imsi, subscr->name, subscr->tmsi, subscr->extension, subscr->lac, subscr->authorized); dbi_result_free(result); + + get_equipment_by_subscr(subscr); + return subscr; } @@ -386,6 +437,16 @@ int db_sync_equipment(struct gsm_equipment *equip) dbi_result result; unsigned char *cm2, *cm3; + printf("DB: Sync Equipment IMEI=%s, classmark1=%02x", + equip->imei, equip->classmark1); + if (equip->classmark2_len) + printf(", classmark2=%s", + hexdump(equip->classmark2, equip->classmark2_len)); + if (equip->classmark3_len) + printf(", classmark3=%s", + hexdump(equip->classmark3, equip->classmark3_len)); + printf("\n"); + dbi_conn_quote_binary_copy(conn, equip->classmark2, equip->classmark2_len, &cm2); dbi_conn_quote_binary_copy(conn, equip->classmark3, |