aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/db.c
diff options
context:
space:
mode:
authorHarald Welte (local) <laflocal@hanuman.gnumonks.org>2009-08-17 09:39:55 +0200
committerHarald Welte (local) <laflocal@hanuman.gnumonks.org>2009-08-17 09:39:55 +0200
commitee4410a4f312d927dc8b4901c71c52436c18ca4a (patch)
treeef1fe06efb62355c9a9e22dafd2ec9b75cf72e68 /openbsc/src/db.c
parentb8afe81e96a5b3ce3681482b8484788fbeb921d9 (diff)
actual code running at end of har2009
Diffstat (limited to 'openbsc/src/db.c')
-rw-r--r--openbsc/src/db.c69
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, &quoted);
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, &quoted);
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, &quoted);
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, &quoted);
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,