add extension field to subscriber struct and name column to db

This commit is contained in:
Jan Luebbe 2008-12-27 22:33:34 +00:00
parent 1a4121882e
commit 391d86e0d5
3 changed files with 65 additions and 19 deletions

View File

@ -8,6 +8,7 @@
#define GSM_IMSI_LENGTH 17
#define GSM_TMSI_LENGTH 17
#define GSM_NAME_LENGTH 128
#define GSM_EXTENSION_LENGTH 128
struct gsm_subscriber {
u_int64_t id;
@ -15,6 +16,7 @@ struct gsm_subscriber {
char tmsi[GSM_TMSI_LENGTH];
u_int16_t lac;
char name[GSM_NAME_LENGTH];
char extension[GSM_EXTENSION_LENGTH];
int authorized;
};

View File

@ -63,16 +63,40 @@ int db_init() {
int db_prepare() {
dbi_result result;
result = dbi_conn_query(conn,
"CREATE TABLE IF NOT EXISTS Meta ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"key TEXT UNIQUE NOT NULL, "
"value TEXT NOT NULL"
")"
);
if (result==NULL) {
printf("DB: Failed to create Meta table.\n");
return 1;
}
dbi_result_free(result);
result = dbi_conn_query(conn,
"INSERT OR IGNORE INTO Meta "
"(key, value) "
"VALUES "
"('revision', '1')"
);
if (result==NULL) {
printf("DB: Failed to create Meta table.\n");
return 1;
}
dbi_result_free(result);
result = dbi_conn_query(conn,
"CREATE TABLE IF NOT EXISTS Subscriber ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"created TIMESTAMP NOT NULL, "
"updated TIMESTAMP NOT NULL, "
"imsi NUMERIC UNIQUE NOT NULL, "
"tmsi TEXT UNIQUE, "
"name TEXT, "
"extension TEXT UNIQUE, "
"lac INTEGER NOT NULL DEFAULT 0, "
"authorized INTEGER NOT NULL DEFAULT 0"
"authorized INTEGER NOT NULL DEFAULT 0, "
"tmsi TEXT UNIQUE, "
"lac INTEGER NOT NULL DEFAULT 0"
")"
);
if (result==NULL) {
@ -129,7 +153,7 @@ struct gsm_subscriber* db_create_subscriber(char imsi[GSM_IMSI_LENGTH]) {
return subscriber;
}
result = dbi_conn_queryf(conn,
"INSERT OR IGNORE INTO Subscriber "
"INSERT INTO Subscriber "
"(imsi, created, updated) "
"VALUES "
"(%s, datetime('now'), datetime('now')) ",
@ -146,21 +170,24 @@ struct gsm_subscriber* db_create_subscriber(char imsi[GSM_IMSI_LENGTH]) {
int db_get_subscriber(enum gsm_subscriber_field field, struct gsm_subscriber* subscriber) {
dbi_result result;
char *string;
const char *string;
char *quoted;
switch (field) {
case GSM_SUBSCRIBER_IMSI:
dbi_conn_quote_string_copy(conn, subscriber->imsi, &quoted);
result = dbi_conn_queryf(conn,
"SELECT * FROM Subscriber "
"WHERE imsi = %s ",
subscriber->imsi
quoted
);
break;
case GSM_SUBSCRIBER_TMSI:
dbi_conn_quote_string_copy(conn, subscriber->tmsi, &quoted);
result = dbi_conn_queryf(conn,
"SELECT * FROM Subscriber "
"WHERE tmsi = %s ",
subscriber->tmsi
quoted
);
break;
default:
@ -185,12 +212,21 @@ int db_get_subscriber(enum gsm_subscriber_field field, struct gsm_subscriber* su
string = dbi_result_get_string(result, "tmsi");
if (string)
strncpy(subscriber->tmsi, string, GSM_TMSI_LENGTH);
string = dbi_result_get_string(result, "name");
if (string)
strncpy(subscriber->name, string, GSM_NAME_LENGTH);
string = dbi_result_get_string(result, "extension");
if (string)
strncpy(subscriber->extension, string, GSM_EXTENSION_LENGTH);
// FIXME handle extension
subscriber->lac = dbi_result_get_uint(result, "lac");
subscriber->authorized = dbi_result_get_uint(result, "authorized");
printf("DB: Found Subscriber: ID %llu, IMSI %s, TMSI %s, LAC %hu, AUTH %u\n",
subscriber->id, subscriber->imsi, subscriber->tmsi, subscriber->lac, subscriber->authorized);
printf("DB: Found Subscriber: ID %llu, IMSI %s, NAME %s TMSI %s, LAC %hu, AUTH %u\n",
subscriber->id, subscriber->imsi, subscriber->name, subscriber->tmsi,
subscriber->lac, subscriber->authorized);
dbi_result_free(result);
return 0;
}
@ -199,7 +235,10 @@ int db_set_subscriber(struct gsm_subscriber* subscriber) {
dbi_result result;
result = dbi_conn_queryf(conn,
"UPDATE Subscriber "
"SET updated = datetime('now'), tmsi = %s, lac = %i, authorized = %i "
"SET updated = datetime('now'), "
"tmsi = %s, "
"lac = %i, "
"authorized = %i "
"WHERE imsi = %s ",
subscriber->tmsi, subscriber->lac, subscriber->authorized, subscriber->imsi
);
@ -212,18 +251,18 @@ int db_set_subscriber(struct gsm_subscriber* subscriber) {
}
int db_subscriber_alloc_tmsi(struct gsm_subscriber* subscriber) {
int error;
dbi_result result=NULL;
char* tmsi_quoted;
for (;;) {
sprintf(subscriber->tmsi, "%i", rand() % 1000000); // FIXME how many nibbles do we want for the tmsi?
sprintf(subscriber->tmsi, "%i", rand());
dbi_conn_quote_string_copy(conn, subscriber->tmsi, &tmsi_quoted);
result = dbi_conn_queryf(conn,
"SELECT * FROM Subscriber "
"WHERE tmsi = %s ",
subscriber->tmsi
tmsi_quoted
);
if (result==NULL) {
printf("DB: Failed to query Subscriber.\n");
printf("DB: Failed to query Subscriber while allocating new TMSI.\n");
return 1;
}
if (dbi_result_get_numrows(result)){
@ -255,7 +294,10 @@ int db_subscriber_assoc_imei(struct gsm_subscriber* subscriber, char imei[GSM_IM
printf("DB: Failed to create Equipment by IMEI.\n");
return 1;
}
equipment_id = dbi_conn_sequence_last(conn, NULL);
equipment_id = 0;
if (dbi_result_get_numrows_affected(result)) {
equipment_id = dbi_conn_sequence_last(conn, NULL);
}
dbi_result_free(result);
if (equipment_id) {
printf("DB: New Equipment: ID %llu, IMEI %s\n", equipment_id, imei);
@ -290,7 +332,10 @@ int db_subscriber_assoc_imei(struct gsm_subscriber* subscriber, char imei[GSM_IM
printf("DB: Failed to create EquipmentWatch.\n");
return 1;
}
watch_id = dbi_conn_sequence_last(conn, NULL);
watch_id = 0;
if (dbi_result_get_numrows_affected(result)) {
watch_id = dbi_conn_sequence_last(conn, NULL);
}
dbi_result_free(result);
if (watch_id) {
printf("DB: New EquipmentWatch: ID %llu, IMSI %s, IMEI %s\n", equipment_id, subscriber->imsi, imei);

View File

@ -39,13 +39,12 @@ int main() {
struct gsm_subscriber *alice = NULL;
alice = db_create_subscriber("3243245432345");
db_subscriber_alloc_tmsi(alice);
alice->lac=42;
db_set_subscriber(alice);
db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice);
free(alice);
alice = db_create_subscriber("3693245423445");
db_subscriber_assoc_imei(alice, "1234567890");
db_subscriber_alloc_tmsi(alice);
alice->lac=42;
db_set_subscriber(alice);