db: Remove the struct gsm_network from the database layer
The database code should not know about the network. Move the setting of the network pointer into the subscriber layer.
This commit is contained in:
parent
0c48fc7c62
commit
7634ec1de1
|
@ -35,10 +35,8 @@ int db_prepare(void);
|
||||||
int db_fini(void);
|
int db_fini(void);
|
||||||
|
|
||||||
/* subscriber management */
|
/* subscriber management */
|
||||||
struct gsm_subscriber *db_create_subscriber(struct gsm_network *net,
|
struct gsm_subscriber *db_create_subscriber(const char *imsi);
|
||||||
char *imsi);
|
struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field,
|
||||||
struct gsm_subscriber *db_get_subscriber(struct gsm_network *net,
|
|
||||||
enum gsm_subscriber_field field,
|
|
||||||
const char *subscr);
|
const char *subscr);
|
||||||
int db_sync_subscriber(struct gsm_subscriber *subscriber);
|
int db_sync_subscriber(struct gsm_subscriber *subscriber);
|
||||||
int db_subscriber_expire(void *priv, void (*callback)(void *priv, long long unsigned int id));
|
int db_subscriber_expire(void *priv, void (*callback)(void *priv, long long unsigned int id));
|
||||||
|
|
|
@ -73,6 +73,8 @@ enum gsm_subscriber_update_reason {
|
||||||
|
|
||||||
struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
|
struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
|
||||||
struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
|
struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
|
||||||
|
struct gsm_subscriber *subscr_create_subscriber(struct gsm_network *net,
|
||||||
|
const char *imsi);
|
||||||
struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
|
struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
|
||||||
uint32_t tmsi);
|
uint32_t tmsi);
|
||||||
struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
|
struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
|
||||||
|
|
|
@ -315,13 +315,13 @@ int db_fini(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gsm_subscriber *db_create_subscriber(struct gsm_network *net, char *imsi)
|
struct gsm_subscriber *db_create_subscriber(const char *imsi)
|
||||||
{
|
{
|
||||||
dbi_result result;
|
dbi_result result;
|
||||||
struct gsm_subscriber *subscr;
|
struct gsm_subscriber *subscr;
|
||||||
|
|
||||||
/* Is this subscriber known in the db? */
|
/* Is this subscriber known in the db? */
|
||||||
subscr = db_get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
|
subscr = db_get_subscriber(GSM_SUBSCRIBER_IMSI, imsi);
|
||||||
if (subscr) {
|
if (subscr) {
|
||||||
result = dbi_conn_queryf(conn,
|
result = dbi_conn_queryf(conn,
|
||||||
"UPDATE Subscriber set updated = datetime('now') "
|
"UPDATE Subscriber set updated = datetime('now') "
|
||||||
|
@ -346,7 +346,6 @@ struct gsm_subscriber *db_create_subscriber(struct gsm_network *net, char *imsi)
|
||||||
);
|
);
|
||||||
if (!result)
|
if (!result)
|
||||||
LOGP(DDB, LOGL_ERROR, "Failed to create Subscriber by IMSI.\n");
|
LOGP(DDB, LOGL_ERROR, "Failed to create Subscriber by IMSI.\n");
|
||||||
subscr->net = net;
|
|
||||||
subscr->id = dbi_conn_sequence_last(conn, NULL);
|
subscr->id = dbi_conn_sequence_last(conn, NULL);
|
||||||
strncpy(subscr->imsi, imsi, GSM_IMSI_LENGTH-1);
|
strncpy(subscr->imsi, imsi, GSM_IMSI_LENGTH-1);
|
||||||
dbi_result_free(result);
|
dbi_result_free(result);
|
||||||
|
@ -645,8 +644,7 @@ static void db_set_from_query(struct gsm_subscriber *subscr, dbi_conn result)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define BASE_QUERY "SELECT * FROM Subscriber "
|
#define BASE_QUERY "SELECT * FROM Subscriber "
|
||||||
struct gsm_subscriber *db_get_subscriber(struct gsm_network *net,
|
struct gsm_subscriber *db_get_subscriber(enum gsm_subscriber_field field,
|
||||||
enum gsm_subscriber_field field,
|
|
||||||
const char *id)
|
const char *id)
|
||||||
{
|
{
|
||||||
dbi_result result;
|
dbi_result result;
|
||||||
|
@ -704,7 +702,6 @@ struct gsm_subscriber *db_get_subscriber(struct gsm_network *net,
|
||||||
}
|
}
|
||||||
|
|
||||||
subscr = subscr_alloc();
|
subscr = subscr_alloc();
|
||||||
subscr->net = net;
|
|
||||||
subscr->id = dbi_result_get_ulonglong(result, "id");
|
subscr->id = dbi_result_get_ulonglong(result, "id");
|
||||||
|
|
||||||
db_set_from_query(subscr, result);
|
db_set_from_query(subscr, result);
|
||||||
|
|
|
@ -474,7 +474,7 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *ms
|
||||||
if (!conn->subscr) {
|
if (!conn->subscr) {
|
||||||
conn->subscr = subscr_get_by_imsi(net, mi_string);
|
conn->subscr = subscr_get_by_imsi(net, mi_string);
|
||||||
if (!conn->subscr)
|
if (!conn->subscr)
|
||||||
conn->subscr = db_create_subscriber(net, mi_string);
|
conn->subscr = subscr_create_subscriber(net, mi_string);
|
||||||
}
|
}
|
||||||
if (conn->loc_operation)
|
if (conn->loc_operation)
|
||||||
conn->loc_operation->waiting_for_imsi = 0;
|
conn->loc_operation->waiting_for_imsi = 0;
|
||||||
|
@ -586,7 +586,7 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb
|
||||||
/* look up subscriber based on IMSI, create if not found */
|
/* look up subscriber based on IMSI, create if not found */
|
||||||
subscr = subscr_get_by_imsi(bts->network, mi_string);
|
subscr = subscr_get_by_imsi(bts->network, mi_string);
|
||||||
if (!subscr) {
|
if (!subscr) {
|
||||||
subscr = db_create_subscriber(bts->network, mi_string);
|
subscr = subscr_create_subscriber(bts->network, mi_string);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GSM_MI_TYPE_TMSI:
|
case GSM_MI_TYPE_TMSI:
|
||||||
|
|
|
@ -78,6 +78,15 @@ enum {
|
||||||
REQ_STATE_DISPATCHED,
|
REQ_STATE_DISPATCHED,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct gsm_subscriber *get_subscriber(struct gsm_network *net,
|
||||||
|
int type, const char *ident)
|
||||||
|
{
|
||||||
|
struct gsm_subscriber *subscr = db_get_subscriber(type, ident);
|
||||||
|
if (subscr)
|
||||||
|
subscr->net = net;
|
||||||
|
return subscr;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We got the channel assigned and can now hand this channel
|
* We got the channel assigned and can now hand this channel
|
||||||
* over to one of our callbacks.
|
* over to one of our callbacks.
|
||||||
|
@ -266,6 +275,14 @@ void subscr_put_channel(struct gsm_subscriber *subscr)
|
||||||
subscr_send_paging_request(subscr);
|
subscr_send_paging_request(subscr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct gsm_subscriber *subscr_create_subscriber(struct gsm_network *net,
|
||||||
|
const char *imsi)
|
||||||
|
{
|
||||||
|
struct gsm_subscriber *subscr = db_create_subscriber(imsi);
|
||||||
|
if (subscr)
|
||||||
|
subscr->net = net;
|
||||||
|
return subscr;
|
||||||
|
}
|
||||||
|
|
||||||
struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
|
struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
|
||||||
uint32_t tmsi)
|
uint32_t tmsi)
|
||||||
|
@ -280,7 +297,7 @@ struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(tmsi_string, "%u", tmsi);
|
sprintf(tmsi_string, "%u", tmsi);
|
||||||
return db_get_subscriber(net, GSM_SUBSCRIBER_TMSI, tmsi_string);
|
return get_subscriber(net, GSM_SUBSCRIBER_TMSI, tmsi_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
|
struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
|
||||||
|
@ -293,7 +310,7 @@ struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
|
||||||
return subscr_get(subscr);
|
return subscr_get(subscr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return db_get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
|
return get_subscriber(net, GSM_SUBSCRIBER_IMSI, imsi);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
|
struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
|
||||||
|
@ -306,7 +323,7 @@ struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
|
||||||
return subscr_get(subscr);
|
return subscr_get(subscr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return db_get_subscriber(net, GSM_SUBSCRIBER_EXTENSION, ext);
|
return get_subscriber(net, GSM_SUBSCRIBER_EXTENSION, ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
|
struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
|
||||||
|
@ -321,7 +338,7 @@ struct gsm_subscriber *subscr_get_by_id(struct gsm_network *net,
|
||||||
return subscr_get(subscr);
|
return subscr_get(subscr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return db_get_subscriber(net, GSM_SUBSCRIBER_ID, buf);
|
return get_subscriber(net, GSM_SUBSCRIBER_ID, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int subscr_update_expire_lu(struct gsm_subscriber *s, struct gsm_bts *bts)
|
int subscr_update_expire_lu(struct gsm_subscriber *s, struct gsm_bts *bts)
|
||||||
|
|
|
@ -229,7 +229,7 @@ DEFUN(subscriber_create,
|
||||||
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
|
struct gsm_network *gsmnet = gsmnet_from_vty(vty);
|
||||||
struct gsm_subscriber *subscr;
|
struct gsm_subscriber *subscr;
|
||||||
|
|
||||||
subscr = db_create_subscriber(gsmnet, argv[0]);
|
subscr = subscr_create_subscriber(gsmnet, argv[0]);
|
||||||
if (!subscr) {
|
if (!subscr) {
|
||||||
vty_out(vty, "%% No subscriber created for IMSI %s%s",
|
vty_out(vty, "%% No subscriber created for IMSI %s%s",
|
||||||
argv[0], VTY_NEWLINE);
|
argv[0], VTY_NEWLINE);
|
||||||
|
|
|
@ -78,32 +78,32 @@ int main()
|
||||||
struct gsm_subscriber *alice_db;
|
struct gsm_subscriber *alice_db;
|
||||||
|
|
||||||
char *alice_imsi = "3243245432345";
|
char *alice_imsi = "3243245432345";
|
||||||
alice = db_create_subscriber(NULL, alice_imsi);
|
alice = db_create_subscriber(alice_imsi);
|
||||||
db_sync_subscriber(alice);
|
db_sync_subscriber(alice);
|
||||||
alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice->imsi);
|
alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice->imsi);
|
||||||
COMPARE(alice, alice_db);
|
COMPARE(alice, alice_db);
|
||||||
SUBSCR_PUT(alice_db);
|
SUBSCR_PUT(alice_db);
|
||||||
SUBSCR_PUT(alice);
|
SUBSCR_PUT(alice);
|
||||||
|
|
||||||
alice_imsi = "3693245423445";
|
alice_imsi = "3693245423445";
|
||||||
alice = db_create_subscriber(NULL, alice_imsi);
|
alice = db_create_subscriber(alice_imsi);
|
||||||
db_subscriber_assoc_imei(alice, "1234567890");
|
db_subscriber_assoc_imei(alice, "1234567890");
|
||||||
db_subscriber_alloc_tmsi(alice);
|
db_subscriber_alloc_tmsi(alice);
|
||||||
alice->lac=42;
|
alice->lac=42;
|
||||||
db_sync_subscriber(alice);
|
db_sync_subscriber(alice);
|
||||||
alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice_imsi);
|
alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi);
|
||||||
COMPARE(alice, alice_db);
|
COMPARE(alice, alice_db);
|
||||||
SUBSCR_PUT(alice);
|
SUBSCR_PUT(alice);
|
||||||
SUBSCR_PUT(alice_db);
|
SUBSCR_PUT(alice_db);
|
||||||
|
|
||||||
alice_imsi = "9993245423445";
|
alice_imsi = "9993245423445";
|
||||||
alice = db_create_subscriber(NULL, alice_imsi);
|
alice = db_create_subscriber(alice_imsi);
|
||||||
db_subscriber_alloc_tmsi(alice);
|
db_subscriber_alloc_tmsi(alice);
|
||||||
alice->lac=42;
|
alice->lac=42;
|
||||||
db_sync_subscriber(alice);
|
db_sync_subscriber(alice);
|
||||||
db_subscriber_assoc_imei(alice, "1234567890");
|
db_subscriber_assoc_imei(alice, "1234567890");
|
||||||
db_subscriber_assoc_imei(alice, "6543560920");
|
db_subscriber_assoc_imei(alice, "6543560920");
|
||||||
alice_db = db_get_subscriber(NULL, GSM_SUBSCRIBER_IMSI, alice_imsi);
|
alice_db = db_get_subscriber(GSM_SUBSCRIBER_IMSI, alice_imsi);
|
||||||
COMPARE(alice, alice_db);
|
COMPARE(alice, alice_db);
|
||||||
SUBSCR_PUT(alice);
|
SUBSCR_PUT(alice);
|
||||||
SUBSCR_PUT(alice_db);
|
SUBSCR_PUT(alice_db);
|
||||||
|
|
Loading…
Reference in New Issue