7 #define sql_update sdb_update 8 #define sql_select sdb_select 10 static Octstr *sqlbox_logtable;
11 static Octstr *sqlbox_insert_table;
18 static DBPool *pool = NULL;
20 static struct sqlbox_db_fields *fields = NULL;
33 static long sdb_conn_type = SDB_OTHER;
41 #define octstr_null_create(x) ((x != NULL) ? octstr_create(x) : octstr_create("")) 42 #define atol_null(x) ((x != NULL) ? atol(x) : -1) 43 #define get_sdb_octstr_col(x) (octstr_create(octstr_get_cstr(gwlist_get(row,x)))) 44 #define get_sdb_long_col(x) (atol(octstr_get_cstr(gwlist_get(row,x)))) 50 #if defined(SQLBOX_TRACE) 56 error(0,
"SDB: Error updating rows");
63 int (*callback)(
int,
char **,
void *),
void *closure)
67 #if defined(SQLBOX_TRACE) 73 error(0,
"SDB: Error selecting rows");
79 void sdb_callback_addrow(
int n,
char **data,
List **rows)
83 for (i = 0; i < n; i++) {
89 void sqlbox_configure_sdb(
Cfg*
cfg)
96 panic(0,
"SQLBOX: Sdb: group 'sqlbox' is not specified!");
99 if (sqlbox_logtable == NULL) {
100 panic(0,
"Parameter 'sql-log-table' not configured.");
103 if (sqlbox_insert_table == NULL) {
104 panic(0,
"Parameter 'sql-insert-table' not configured.");
109 error(0,
"SDB: Database pool got no connection! DB update failed!");
134 error(0,
"SDB: Database pool got no connection! DB update failed!");
140 #if defined(SQLBOX_TRACE) 143 if (sql_select(pc, sql, (
void *)sdb_callback_addrow, &res) < 0) {
149 id = get_sdb_octstr_col(0);
153 msg->sms.foreign_id = get_sdb_octstr_col(0);
154 msg->sms.sender = get_sdb_octstr_col(2);
155 msg->sms.receiver = get_sdb_octstr_col(3);
156 msg->sms.udhdata = get_sdb_octstr_col(4);
157 msg->sms.msgdata = get_sdb_octstr_col(5);
158 msg->sms.time = get_sdb_long_col(6);
159 msg->sms.smsc_id = get_sdb_octstr_col(7);
160 msg->sms.service = get_sdb_octstr_col(8);
161 msg->sms.account = get_sdb_octstr_col(9);
163 msg->sms.sms_type = get_sdb_long_col(11);
164 msg->sms.mclass = get_sdb_long_col(12);
165 msg->sms.mwi = get_sdb_long_col(13);
166 msg->sms.coding = get_sdb_long_col(14);
167 msg->sms.compress = get_sdb_long_col(15);
168 msg->sms.validity = get_sdb_long_col(16);
169 msg->sms.deferred = get_sdb_long_col(17);
170 msg->sms.dlr_mask = get_sdb_long_col(18);
171 msg->sms.dlr_url = get_sdb_octstr_col(19);
172 msg->sms.pid = get_sdb_long_col(20);
173 msg->sms.alt_dcs = get_sdb_long_col(21);
174 msg->sms.rpi = get_sdb_long_col(22);
175 msg->sms.charset = get_sdb_octstr_col(23);
176 msg->sms.binfo = get_sdb_octstr_col(25);
177 msg->sms.meta_data = get_sdb_octstr_col(26);
182 msg->sms.boxc_id= get_sdb_octstr_col(24);
186 #if defined(SQLBOX_TRACE) 189 sql_update(pc, delet);
201 static Octstr *get_numeric_value_or_return_null(
long int num)
209 static Octstr *get_string_value_or_return_null(
Octstr *str)
222 #define st_num(x) (stuffer[stuffcount++] = get_numeric_value_or_return_null(x)) 223 #define st_str(x) (stuffer[stuffcount++] = get_string_value_or_return_null(x)) 234 error(0,
"SDB: Database pool got no connection! DB update failed!");
239 st_str(
msg->sms.receiver), st_str(
msg->sms.udhdata), st_str(
msg->sms.msgdata), st_num(
msg->sms.time),
240 st_str(
msg->sms.smsc_id), st_str(
msg->sms.service), st_str(
msg->sms.account), st_num(
msg->sms.sms_type),
241 st_num(
msg->sms.mclass), st_num(
msg->sms.mwi), st_num(
msg->sms.coding), st_num(
msg->sms.compress),
242 st_num(
msg->sms.validity), st_num(
msg->sms.deferred), st_num(
msg->sms.dlr_mask), st_str(
msg->sms.dlr_url),
243 st_num(
msg->sms.pid), st_num(
msg->sms.alt_dcs), st_num(
msg->sms.rpi), st_str(
msg->sms.charset),
244 st_str(
msg->sms.boxc_id), st_str(
msg->sms.binfo), st_str(
msg->sms.meta_data), st_str(
msg->sms.foreign_id));
246 while (stuffcount > 0) {
273 panic(0,
"SQLBOX: Sdb: group 'sqlbox' is not specified!");
276 panic(0,
"SQLBOX: Sdb: directive 'id' is not specified!");
294 panic(0,
"SQLBOX: Sdb: connection settings for id '%s' are not specified!",
305 panic(0,
"SQLBOX: SDB: directive 'url' is not specified!");
311 warning(0,
"SQLBOX[sdb]: Please use native MySQL support, instead of libsdb.");
312 sdb_conn_type = SDB_MYSQL;
324 sdb_conn_type = SDB_ORACLE;
336 sdb_conn_type = SDB_POSTGRES;
348 sdb_conn_type = SDB_SQLITE;
360 sdb_conn_type = SDB_SQLITE3;
372 sdb_conn_type = SDB_OTHER;
386 db_conf = gw_malloc(
sizeof(
DBConf));
392 db_conf->
sdb->
url = sdb_url;
401 panic(0,
"SQLBOX: Sdb: database pool has no connections!");
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)
void gwlist_append(List *list, void *item)
long gwlist_len(List *list)
void * gwlist_get(List *list, long pos)
long octstr_search(const Octstr *haystack, const Octstr *needle, long pos)
#define cfg_get(grp, varname)
char * create_log_trigger
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)
void warning(int err, const char *fmt,...)
Octstr * octstr_format(const char *fmt,...)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
void octstr_destroy_item(void *os)
void gwlist_insert(List *list, long pos, void *item)
char * create_log_sequence
void dbpool_destroy(DBPool *p)
char * create_insert_trigger
void debug(const char *place, int err, const char *fmt,...)
int cfg_get_integer(long *n, CfgGroup *grp, Octstr *varname)
char * create_insert_table
DBPoolConn * dbpool_conn_consume(DBPool *p)
char * create_insert_sequence
#define sqlbox_run_query(query, table)
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)