diff options
Diffstat (limited to 'src/db_hlr.c')
-rw-r--r-- | src/db_hlr.c | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/src/db_hlr.c b/src/db_hlr.c index 5db2c9e..b232dfd 100644 --- a/src/db_hlr.c +++ b/src/db_hlr.c @@ -19,9 +19,11 @@ #include <string.h> #include <errno.h> +#include <inttypes.h> #include <osmocom/core/utils.h> #include <osmocom/crypt/auth.h> +#include <osmocom/gsm/gsm23003.h> #include <sqlite3.h> @@ -38,6 +40,120 @@ x[sizeof(x)-1] = '\0'; \ } while (0) +int db_subscr_create(struct db_context *dbc, const char *imsi) +{ + sqlite3_stmt *stmt; + int rc; + + if (!osmo_imsi_str_valid(imsi)) { + LOGP(DAUC, LOGL_ERROR, "Cannot create subscriber: invalid IMSI: '%s'\n", + imsi); + return -EINVAL; + } + + stmt = dbc->stmt[DB_STMT_SUBSCR_CREATE]; + + if (!db_bind_text(stmt, "$imsi", imsi)) + return -EIO; + + /* execute the statement */ + rc = sqlite3_step(stmt); + db_remove_reset(stmt); + if (rc != SQLITE_DONE) { + LOGHLR(imsi, LOGL_ERROR, "Cannot create subscriber: SQL error: (%d) %s\n", + rc, sqlite3_errmsg(dbc->db)); + return -EIO; + } + + return 0; +} + +int db_subscr_delete_by_id(struct db_context *dbc, int64_t subscr_id) +{ + int rc; + int ret = 0; + + sqlite3_stmt *stmt = dbc->stmt[DB_STMT_DEL_BY_ID]; + + if (!db_bind_int64(stmt, "$subscriber_id", subscr_id)) + return -EIO; + + /* execute the statement */ + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + LOGP(DAUC, LOGL_ERROR, + "Cannot delete subscriber ID=%"PRId64": SQL error: (%d) %s\n", + subscr_id, rc, sqlite3_errmsg(dbc->db)); + db_remove_reset(stmt); + return -EIO; + } + + /* verify execution result */ + rc = sqlite3_changes(dbc->db); + if (!rc) { + LOGP(DAUC, LOGL_ERROR, "Cannot delete: no such subscriber: ID=%"PRId64"\n", + subscr_id); + ret = -ENOENT; + } else if (rc != 1) { + LOGP(DAUC, LOGL_ERROR, "Delete subscriber ID=%"PRId64 + ": SQL modified %d rows (expected 1)\n", subscr_id, rc); + ret = -EIO; + } + + /* FIXME: also remove authentication data from auc_2g and auc_3g */ + + db_remove_reset(stmt); + return ret; +} + +int db_subscr_update_msisdn_by_imsi(struct db_context *dbc, const char *imsi, + const char *msisdn) +{ + int rc; + int ret = 0; + + if (!osmo_msisdn_str_valid(msisdn)) { + LOGHLR(imsi, LOGL_ERROR, + "Cannot update subscriber: invalid MSISDN: '%s'\n", + msisdn); + return -EINVAL; + } + + sqlite3_stmt *stmt = dbc->stmt[DB_STMT_SET_MSISDN_BY_IMSI]; + + if (!db_bind_text(stmt, "$imsi", imsi)) + return -EIO; + if (!db_bind_text(stmt, "$msisdn", msisdn)) + return -EIO; + + /* execute the statement */ + rc = sqlite3_step(stmt); + if (rc != SQLITE_DONE) { + LOGHLR(imsi, LOGL_ERROR, + "Cannot update subscriber's MSISDN: SQL error: (%d) %s\n", + rc, sqlite3_errmsg(dbc->db)); + ret = -EIO; + goto out; + } + + /* verify execution result */ + rc = sqlite3_changes(dbc->db); + if (!rc) { + LOGP(DAUC, LOGL_ERROR, "Cannot update MSISDN: no such subscriber: IMSI='%s'\n", + imsi); + ret = -ENOENT; + goto out; + } else if (rc != 1) { + LOGHLR(imsi, LOGL_ERROR, "Update MSISDN: SQL modified %d rows (expected 1)\n", rc); + ret = -EIO; + } + +out: + db_remove_reset(stmt); + return ret; + +} + int db_subscr_get_by_imsi(struct db_context *dbc, const char *imsi, struct hlr_subscriber *subscr) { |