#include "db.h" #include #include dbi_conn conn; void db__error_func(dbi_conn conn, void* data) { const char* msg; dbi_conn_error(conn, &msg); printf("DBI: %s\n", msg); } int db_init() { dbi_initialize(NULL); conn = dbi_conn_new("sqlite3"); dbi_conn_error_handler( conn, db__error_func, NULL ); /* MySQL dbi_conn_set_option(conn, "host", "localhost"); dbi_conn_set_option(conn, "username", "your_name"); dbi_conn_set_option(conn, "password", "your_password"); dbi_conn_set_option(conn, "dbname", "your_dbname"); dbi_conn_set_option(conn, "encoding", "UTF-8"); */ /* SqLite 3 */ dbi_conn_set_option(conn, "sqlite3_dbdir", "/tmp"); dbi_conn_set_option(conn, "dbname", "hlr.sqlite3"); if (dbi_conn_connect(conn) < 0) { return 1; } return 0; } int db_prepare() { dbi_result result; result = dbi_conn_query(conn, "CREATE TABLE IF NOT EXISTS Subscriber (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "imsi INTEGER UNIQUE NOT NULL, " "tmsi INTEGER UNIQUE, " "extension TEXT UNIQUE, " "lac INTEGER" ")" ); if (result==NULL) { printf("DB: Failed to create Subscriber table.\n"); return 1; } dbi_result_free(result); result = dbi_conn_query(conn, "CREATE TABLE IF NOT EXISTS Equipment (" "id INTEGER PRIMARY KEY AUTOINCREMENT, " "imei INTEGER UNIQUE NOT NULL" ")" ); if (result==NULL) { printf("DB: Failed to create Equipment table.\n"); return 1; } dbi_result_free(result); return 0; } int db_fini() { dbi_conn_close(conn); dbi_shutdown(); } int db_insert_imei(uint64_t imei) { dbi_result result; result = dbi_conn_queryf(conn, "INSERT OR IGNORE INTO Equipment " "(imei) " "VALUES " "(%llu) ", imei ); if (result==NULL) { printf("DB: Failed to create Equipment by IMEI.\n"); return 1; } dbi_result_free(result); return 0; } int db_insert_imsi(uint64_t imsi) { dbi_result result; result = dbi_conn_queryf(conn, "INSERT OR IGNORE INTO Subscriber " "(imsi) " "VALUES " "(%llu) ", imsi ); if (result==NULL) { printf("DB: Failed to create Subscriber by IMSI.\n"); return 1; } dbi_result_free(result); return 0; } int db_imsi_set_tmsi(uint64_t imsi, uint64_t tmsi) { if (db_insert_imsi(imsi)) { return 1; } dbi_result result; result = dbi_conn_queryf(conn, "UPDATE Subscriber " "SET tmsi = %llu " "WHERE imsi = %llu ", tmsi, imsi ); if (result==NULL) { printf("DB: Failed to update Subscriber with TMSI by IMSI.\n"); return 1; } dbi_result_free(result); return 0; } int db_imsi_set_lac(uint64_t imsi, uint16_t lac) { if (db_insert_imsi(imsi)) { return 1; } dbi_result result; result = dbi_conn_queryf(conn, "UPDATE Subscriber " "SET lac = %u " "WHERE imsi = %llu ", lac, imsi ); if (result==NULL) { printf("DB: Failed to update Subscriber with LAC by IMSI.\n"); return 1; } dbi_result_free(result); return 0; } int db__parse_subscriber(dbi_result result, db_subscriber* subscriber) { if (!dbi_result_first_row(result)) { printf("DB: Failed to find Subscriber.\n"); return 1; } subscriber->imsi = dbi_result_get_ulonglong(result, "imsi"); subscriber->tmsi = dbi_result_get_ulonglong(result, "tmsi"); // FIXME handle extension subscriber->lac = dbi_result_get_uint(result, "lac"); printf("DB: Subscriber: IMSI %llu, TMSI %llu, LAC %hu\n", subscriber->imsi, subscriber->tmsi, subscriber->lac); return 0; } int db_imsi_get_subscriber(uint64_t imsi, db_subscriber* subscriber) { dbi_result result; result = dbi_conn_queryf(conn, "SELECT * FROM Subscriber " "WHERE imsi = %llu ", imsi ); if (result==NULL) { printf("DB: Failed to find Subscriber by IMSI.\n"); return 1; } if (db__parse_subscriber(result, subscriber)) { printf("DB: Failed to parse Subscriber.\n"); dbi_result_free(result); return 1; } dbi_result_free(result); return 0; } int db_tmsi_get_subscriber(uint64_t tmsi, db_subscriber* subscriber) { dbi_result result; result = dbi_conn_queryf(conn, "SELECT * FROM Subscriber " "WHERE tmsi = %llu ", tmsi ); if (result==NULL) { printf("DB: Failed to find Subscriber by TMSI.\n"); return 1; } if (db__parse_subscriber(result, subscriber)) { printf("DB: Failed to parse Subscriber.\n"); dbi_result_free(result); return 1; } dbi_result_free(result); return 0; }