7 #define sql_update sqlite_update 8 #define sql_select sqlite_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) 34 #if defined(SQLBOX_TRACE) 39 if (state != SQLITE_OK) {
40 error(0,
"SQLITE: %s", errmsg);
43 return sqlite_changes(conn->
conn);
50 const char *query_tail = NULL;
54 #if defined(SQLBOX_TRACE) 59 if (res != SQLITE_OK) {
60 error(0,
"SQLITE: Could not compile query: %s", errmsg);
66 void sqlbox_configure_sqlite(
Cfg*
cfg)
73 panic(0,
"SQLBOX: Sqlite: group 'sqlbox' is not specified!");
76 if (sqlbox_logtable == NULL) {
77 panic(0,
"Parameter 'sql-log-table' not configured.");
80 if (sqlbox_insert_table == NULL) {
81 panic(0,
"Parameter 'sql-insert-table' not configured.");
86 error(0,
"SQLITE: Database pool got no connection! DB update failed!");
91 sql =
octstr_format(SQLBOX_SQLITE_CREATE_LOG_TABLE, sqlbox_logtable);
94 sql =
octstr_format(SQLBOX_SQLITE_CREATE_INSERT_TABLE, sqlbox_insert_table);
101 Msg *sqlite_fetch_msg()
106 const char *query_tail = NULL;
107 sqlite_vm *res = NULL;
108 int i, cols = 0, rows = 0;
109 const char **row = NULL;
110 const char **col_name = NULL;
117 error(0,
"SQLITE: Database pool got no connection! DB update failed!");
121 sql =
octstr_format(SQLBOX_SQLITE_SELECT_QUERY, sqlbox_insert_table);
122 #if defined(SQLBOX_TRACE) 125 res = sql_select(pc, sql);
127 state=sqlite_step(res, &cols, &row, &col_name);
128 if (state==SQLITE_ROW){
130 id = octstr_null_create(row[0]);
134 msg->sms.foreign_id = octstr_null_create(row[0]);
135 msg->sms.sender = octstr_null_create(row[2]);
136 msg->sms.receiver = octstr_null_create(row[3]);
137 msg->sms.udhdata = octstr_null_create(row[4]);
138 msg->sms.msgdata = octstr_null_create(row[5]);
139 msg->sms.time = atol_null(row[6]);
140 msg->sms.smsc_id = octstr_null_create(row[7]);
141 msg->sms.service = octstr_null_create(row[8]);
142 msg->sms.account = octstr_null_create(row[9]);
144 msg->sms.sms_type = atol_null(row[11]);
145 msg->sms.mclass = atol_null(row[12]);
146 msg->sms.mwi = atol_null(row[13]);
147 msg->sms.coding = atol_null(row[14]);
148 msg->sms.compress = atol_null(row[15]);
149 msg->sms.validity = atol_null(row[16]);
150 msg->sms.deferred = atol_null(row[17]);
151 msg->sms.dlr_mask = atol_null(row[18]);
152 msg->sms.dlr_url = octstr_null_create(row[19]);
153 msg->sms.pid = atol_null(row[20]);
154 msg->sms.alt_dcs = atol_null(row[21]);
155 msg->sms.rpi = atol_null(row[22]);
156 msg->sms.charset = octstr_null_create(row[23]);
157 msg->sms.binfo = octstr_null_create(row[25]);
158 msg->sms.meta_data = octstr_null_create(row[26]);
159 if (row[24] == NULL) {
162 msg->sms.boxc_id= octstr_null_create(row[24]);
165 }
while (state==SQLITE_ROW);
166 sqlite_finalize(res, NULL);
170 delet =
octstr_format(SQLBOX_SQLITE_DELETE_QUERY, sqlbox_insert_table,
id);
171 #if defined(SQLBOX_TRACE) 174 sql_update(pc, delet);
183 static Octstr *get_numeric_value_or_return_null(
long int num)
191 static Octstr *get_string_value_or_return_null(
Octstr *str)
204 #define st_num(x) (stuffer[stuffcount++] = get_numeric_value_or_return_null(x)) 205 #define st_str(x) (stuffer[stuffcount++] = get_string_value_or_return_null(x)) 216 error(0,
"SQLITE: Database pool got no connection! DB update failed!");
220 sql =
octstr_format(SQLBOX_SQLITE_INSERT_QUERY, sqlbox_logtable, st_str(momt), st_str(
msg->sms.sender),
221 st_str(
msg->sms.receiver), st_str(
msg->sms.udhdata), st_str(
msg->sms.msgdata), st_num(
msg->sms.time),
222 st_str(
msg->sms.smsc_id), st_str(
msg->sms.service), st_str(
msg->sms.account), st_num(
msg->sms.sms_type),
223 st_num(
msg->sms.mclass), st_num(
msg->sms.mwi), st_num(
msg->sms.coding), st_num(
msg->sms.compress),
224 st_num(
msg->sms.validity), st_num(
msg->sms.deferred), st_num(
msg->sms.dlr_mask), st_str(
msg->sms.dlr_url),
225 st_num(
msg->sms.pid), st_num(
msg->sms.alt_dcs), st_num(
msg->sms.rpi), st_str(
msg->sms.charset),
226 st_str(
msg->sms.boxc_id), st_str(
msg->sms.binfo), st_str(
msg->sms.meta_data), st_str(
msg->sms.foreign_id));
228 while (stuffcount > 0) {
244 Octstr *sqlite_db, *sqlite_id;
256 panic(0,
"SQLBOX: Sqlite: group 'sqlbox' is not specified!");
259 panic(0,
"SQLBOX: Sqlite: directive 'id' is not specified!");
277 panic(0,
"SQLBOX: Sqlite: connection settings for id '%s' are not specified!",
288 panic(0,
"SQLBOX: Sqlite: directive 'database' is not specified!");
295 db_conf = gw_malloc(
sizeof(
DBConf));
311 panic(0,
"SQLBOX: Sqlite: database pool has no connections!");
319 res->
sql_enter = sqlbox_configure_sqlite;
void error(int err, const char *fmt,...)
int(* sql_fetch_msg_list)(List *, long)
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)
void(* sql_save_list)(List *, Octstr *, int)
#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)