7 #define sql_update sqlite3_update 8 #define sql_select sqlite3_select 10 static Octstr *sqlbox_logtable;
11 static Octstr *sqlbox_insert_table;
17 static DBPool *pool = NULL;
25 #define octstr_null_create(x) ((x != NULL) ? octstr_create(x) : octstr_create("")) 26 #define atol_null(x) ((x != NULL) ? atol(x) : -1) 33 #if defined(SQLBOX_TRACE) 38 if (state != SQLITE_OK) {
39 error(0,
"SQLITE3: %s", sqlite3_errmsg(conn->
conn));
42 return sqlite3_changes(conn->
conn);
48 sqlite3_stmt *stmt = NULL;
50 #if defined(SQLBOX_TRACE) 55 if (res != SQLITE_OK) {
56 error(0,
"SQLITE3: Could not compile query: %s", sqlite3_errmsg(conn->
conn));
62 void sqlbox_configure_sqlite3(
Cfg*
cfg)
69 panic(0,
"SQLBOX: Sqlite3: group 'sqlbox' is not specified!");
72 if (sqlbox_logtable == NULL) {
73 panic(0,
"Parameter 'sql-log-table' configured.");
76 if (sqlbox_insert_table == NULL) {
77 panic(0,
"Parameter 'sql-insert-table' configured.");
82 error(0,
"SQLITE3: Database pool got no connection! DB update failed!");
87 sql =
octstr_format(SQLBOX_SQLITE3_CREATE_LOG_TABLE, sqlbox_logtable);
90 sql =
octstr_format(SQLBOX_SQLITE3_CREATE_LOG_TABLE, sqlbox_insert_table);
97 Msg *sqlite3_fetch_msg()
101 sqlite3_stmt *res = NULL;
104 Octstr *sql, *delet, *
id = NULL;
108 error(0,
"SQLITE3: Database pool got no connection! DB update failed!");
112 sql =
octstr_format(SQLBOX_SQLITE3_SELECT_QUERY, sqlbox_insert_table);
113 #if defined(SQLBOX_TRACE) 116 res = sql_select(pc, sql);
118 state=sqlite3_step(res);
119 if (state==SQLITE_ROW){
121 id = octstr_null_create((
char *)sqlite3_column_text(res, 0));
124 msg->sms.sender = octstr_null_create((
char *)sqlite3_column_text(res, 2));
125 msg->sms.receiver = octstr_null_create((
char *)sqlite3_column_text(res, 3));
126 msg->sms.udhdata = octstr_null_create((
char *)sqlite3_column_text(res, 4));
127 msg->sms.msgdata = octstr_null_create((
char *)sqlite3_column_text(res, 5));
128 msg->sms.time = atol_null((
char *)sqlite3_column_text(res,6));
129 msg->sms.smsc_id = octstr_null_create((
char *)sqlite3_column_text(res, 7));
130 msg->sms.service = octstr_null_create((
char *)sqlite3_column_text(res, 8));
131 msg->sms.account = octstr_null_create((
char *)sqlite3_column_text(res, 9));
133 msg->sms.sms_type = atol_null((
char *)sqlite3_column_text(res, 11));
134 msg->sms.mclass = atol_null((
char *)sqlite3_column_text(res, 12));
135 msg->sms.mwi = atol_null((
char *)sqlite3_column_text(res, 13));
136 msg->sms.coding = atol_null((
char *)sqlite3_column_text(res, 14));
137 msg->sms.compress = atol_null((
char *)sqlite3_column_text(res, 15));
138 msg->sms.validity = atol_null((
char *)sqlite3_column_text(res, 16));
139 msg->sms.deferred = atol_null((
char *)sqlite3_column_text(res, 17));
140 msg->sms.dlr_mask = atol_null((
char *)sqlite3_column_text(res, 18));
141 msg->sms.dlr_url = octstr_null_create((
char *)sqlite3_column_text(res, 19));
142 msg->sms.pid = atol_null((
char *)sqlite3_column_text(res, 20));
143 msg->sms.alt_dcs = atol_null((
char *)sqlite3_column_text(res, 21));
144 msg->sms.rpi = atol_null((
char *)sqlite3_column_text(res, 22));
145 msg->sms.charset = octstr_null_create((
char *)sqlite3_column_text(res, 23));
146 msg->sms.binfo = octstr_null_create((
char *)sqlite3_column_text(res, 25));
147 msg->sms.meta_data = octstr_null_create((
char *)sqlite3_column_text(res, 26));
148 msg->sms.boxc_id = (sqlite3_column_text(res, 24) == NULL) ?
octstr_duplicate(
sqlbox_id):octstr_null_create((
char *)sqlite3_column_text(res, 24));
150 }
while (state==SQLITE_ROW);
151 sqlite3_finalize(res);
155 delet =
octstr_format(SQLBOX_SQLITE3_DELETE_QUERY, sqlbox_insert_table,
id);
156 #if defined(SQLBOX_TRACE) 159 sql_update(pc, delet);
169 static Octstr *get_numeric_value_or_return_null(
long int num)
177 static Octstr *get_string_value_or_return_null(
Octstr *str)
190 #define st_num(x) (stuffer[stuffcount++] = get_numeric_value_or_return_null(x)) 191 #define st_str(x) (stuffer[stuffcount++] = get_string_value_or_return_null(x)) 202 error(0,
"SQLITE3: Database pool got no connection! DB update failed!");
206 sql =
octstr_format(SQLBOX_SQLITE3_INSERT_QUERY, sqlbox_logtable, st_str(momt), st_str(
msg->sms.sender),
207 st_str(
msg->sms.receiver), st_str(
msg->sms.udhdata), st_str(
msg->sms.msgdata), st_num(
msg->sms.time),
208 st_str(
msg->sms.smsc_id), st_str(
msg->sms.service), st_str(
msg->sms.account), st_num(
msg->sms.sms_type),
209 st_num(
msg->sms.mclass), st_num(
msg->sms.mwi), st_num(
msg->sms.coding), st_num(
msg->sms.compress),
210 st_num(
msg->sms.validity), st_num(
msg->sms.deferred), st_num(
msg->sms.dlr_mask), st_str(
msg->sms.dlr_url),
211 st_num(
msg->sms.pid), st_num(
msg->sms.alt_dcs), st_num(
msg->sms.rpi), st_str(
msg->sms.charset),
212 st_str(
msg->sms.boxc_id), st_str(
msg->sms.binfo), st_str(
msg->sms.meta_data));
214 while (stuffcount > 0) {
230 Octstr *sqlite3_db, *sqlite3_id;
232 long pool_size, lock_timeout;
241 panic(0,
"SQLBOX: Sqlite3: group 'sqlbox' is not specified!");
244 panic(0,
"SQLBOX: Sqlite3: directive 'id' is not specified!");
262 panic(0,
"SQLBOX: Sqlite3: connection settings for id '%s' are not specified!",
273 panic(0,
"SQLBOX: Sqlite3: directive 'database' is not specified!");
280 db_conf = gw_malloc(
sizeof(
DBConf));
296 panic(0,
"SQLBOX: Sqlite3: database pool has no connections!");
304 res->
sql_enter = sqlbox_configure_sqlite3;
void error(int err, const char *fmt,...)
void octstr_replace(Octstr *haystack, Octstr *needle, Octstr *repl)
long dbpool_conn_count(DBPool *p)
DBPool * dbpool_create(enum db_type db_type, DBConf *conf, unsigned int connections)
gw_assert(wtls_machine->packet_to_send !=NULL)
#define cfg_get(grp, varname)
#define octstr_get_cstr(ostr)
static struct pid_list * found
void dbpool_conn_produce(DBPoolConn *conn)
Octstr * octstr_imm(const char *cstr)
void * gwlist_extract_first(List *list)
#define octstr_duplicate(ostr)
List * cfg_get_multi_group(Cfg *cfg, Octstr *name)
Octstr * octstr_format(const char *fmt,...)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
void dbpool_destroy(DBPool *p)
void debug(const char *place, int err, const char *fmt,...)
int cfg_get_integer(long *n, CfgGroup *grp, Octstr *varname)
DBPoolConn * dbpool_conn_consume(DBPool *p)
CfgGroup * cfg_get_single_group(Cfg *cfg, Octstr *name)
static XMLRPCDocument * msg
void(* sql_save_msg)(Msg *, Octstr *)
int octstr_compare(const Octstr *ostr1, const Octstr *ostr2)
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)