blob: 904281ae91a8b6d3ace3a756c7a40d57357fb234 [file] [log] [blame]
Jan Luebbe7398eb92008-12-27 00:45:41 +00001#include "db.h"
2
3#include <stdio.h>
4#include <dbi/dbi.h>
5
6dbi_conn conn;
7
8void db__error_func(dbi_conn conn, void* data) {
9 const char* msg;
10 dbi_conn_error(conn, &msg);
11 printf("DBI: %s\n", msg);
12}
13
14int db_init() {
15 dbi_initialize(NULL);
16 conn = dbi_conn_new("sqlite3");
17
18 dbi_conn_error_handler( conn, db__error_func, NULL );
19
20 /* MySQL
21 dbi_conn_set_option(conn, "host", "localhost");
22 dbi_conn_set_option(conn, "username", "your_name");
23 dbi_conn_set_option(conn, "password", "your_password");
24 dbi_conn_set_option(conn, "dbname", "your_dbname");
25 dbi_conn_set_option(conn, "encoding", "UTF-8");
26 */
27
28 /* SqLite 3 */
29 dbi_conn_set_option(conn, "sqlite3_dbdir", "/tmp");
30 dbi_conn_set_option(conn, "dbname", "hlr.sqlite3");
31
32 if (dbi_conn_connect(conn) < 0) {
33 return 1;
34 }
35
36 return 0;
37}
38
39int db_prepare() {
40 dbi_result result;
41 result = dbi_conn_query(conn,
42 "CREATE TABLE IF NOT EXISTS Subscriber ("
43 "id INTEGER PRIMARY KEY AUTOINCREMENT, "
44 "imsi INTEGER UNIQUE NOT NULL, "
45 "tmsi INTEGER UNIQUE, "
46 "extension TEXT UNIQUE, "
47 "lac INTEGER"
48 ")"
49 );
50 if (result==NULL) {
51 printf("DB: Failed to create Subscriber table.\n");
52 return 1;
53 }
54 dbi_result_free(result);
55 result = dbi_conn_query(conn,
56 "CREATE TABLE IF NOT EXISTS Equipment ("
57 "id INTEGER PRIMARY KEY AUTOINCREMENT, "
58 "imei INTEGER UNIQUE NOT NULL"
59 ")"
60 );
61 if (result==NULL) {
62 printf("DB: Failed to create Equipment table.\n");
63 return 1;
64 }
65 dbi_result_free(result);
66 return 0;
67}
68
69int db_fini() {
70 dbi_conn_close(conn);
71 dbi_shutdown();
72}
73
74int db_insert_imei(uint64_t imei) {
75 dbi_result result;
76 result = dbi_conn_queryf(conn,
77 "INSERT OR IGNORE INTO Equipment "
78 "(imei) "
79 "VALUES "
80 "(%llu) ",
81 imei
82 );
83 if (result==NULL) {
84 printf("DB: Failed to create Equipment by IMEI.\n");
85 return 1;
86 }
87 dbi_result_free(result);
88 return 0;
89}
90
91int db_insert_imsi(uint64_t imsi) {
92 dbi_result result;
93 result = dbi_conn_queryf(conn,
94 "INSERT OR IGNORE INTO Subscriber "
95 "(imsi) "
96 "VALUES "
97 "(%llu) ",
98 imsi
99 );
100 if (result==NULL) {
101 printf("DB: Failed to create Subscriber by IMSI.\n");
102 return 1;
103 }
104 dbi_result_free(result);
105 return 0;
106}
107
108int db_imsi_set_tmsi(uint64_t imsi, uint64_t tmsi) {
109 if (db_insert_imsi(imsi)) {
110 return 1;
111 }
112 dbi_result result;
113 result = dbi_conn_queryf(conn,
114 "UPDATE Subscriber "
115 "SET tmsi = %llu "
116 "WHERE imsi = %llu ",
117 tmsi, imsi
118 );
119 if (result==NULL) {
120 printf("DB: Failed to update Subscriber with TMSI by IMSI.\n");
121 return 1;
122 }
123 dbi_result_free(result);
124 return 0;
125}
126
127int db_imsi_set_lac(uint64_t imsi, uint16_t lac) {
128 if (db_insert_imsi(imsi)) {
129 return 1;
130 }
131 dbi_result result;
132 result = dbi_conn_queryf(conn,
133 "UPDATE Subscriber "
134 "SET lac = %u "
135 "WHERE imsi = %llu ",
136 lac, imsi
137 );
138 if (result==NULL) {
139 printf("DB: Failed to update Subscriber with LAC by IMSI.\n");
140 return 1;
141 }
142 dbi_result_free(result);
143 return 0;
144}
145
146int db__parse_subscriber(dbi_result result, db_subscriber* subscriber) {
147 if (!dbi_result_first_row(result)) {
148 printf("DB: Failed to find Subscriber.\n");
149 return 1;
150 }
151 subscriber->imsi = dbi_result_get_ulonglong(result, "imsi");
152 subscriber->tmsi = dbi_result_get_ulonglong(result, "tmsi");
153 // FIXME handle extension
154 subscriber->lac = dbi_result_get_uint(result, "lac");
155 printf("DB: Subscriber: IMSI %llu, TMSI %llu, LAC %hu\n", subscriber->imsi, subscriber->tmsi, subscriber->lac);
156 return 0;
157}
158
159int db_imsi_get_subscriber(uint64_t imsi, db_subscriber* subscriber) {
160 dbi_result result;
161 result = dbi_conn_queryf(conn,
162 "SELECT * FROM Subscriber "
163 "WHERE imsi = %llu ",
164 imsi
165 );
166 if (result==NULL) {
167 printf("DB: Failed to find Subscriber by IMSI.\n");
168 return 1;
169 }
170 if (db__parse_subscriber(result, subscriber)) {
171 printf("DB: Failed to parse Subscriber.\n");
172 dbi_result_free(result);
173 return 1;
174 }
175 dbi_result_free(result);
176 return 0;
177}
178
179int db_tmsi_get_subscriber(uint64_t tmsi, db_subscriber* subscriber) {
180 dbi_result result;
181 result = dbi_conn_queryf(conn,
182 "SELECT * FROM Subscriber "
183 "WHERE tmsi = %llu ",
184 tmsi
185 );
186 if (result==NULL) {
187 printf("DB: Failed to find Subscriber by TMSI.\n");
188 return 1;
189 }
190 if (db__parse_subscriber(result, subscriber)) {
191 printf("DB: Failed to parse Subscriber.\n");
192 dbi_result_free(result);
193 return 1;
194 }
195 dbi_result_free(result);
196 return 0;
197}
198