7 #define sql_update mysql_update 8 #define sql_select mysql_select 9 #define MYSQL_ERR_NOSUCHFIELD 1054 11 static Octstr *sqlbox_logtable;
12 static Octstr *sqlbox_insert_table;
18 static DBPool *pool = NULL;
20 static void mysql_update(
const Octstr *sql)
25 #if defined(SQLBOX_TRACE) 31 error(0,
"MYSQL: Database pool got no connection! DB update failed!");
37 error(0,
"MYSQL: %s", mysql_error(pc->
conn));
38 if (mysql_errno(pc->
conn) == MYSQL_ERR_NOSUCHFIELD) {
39 error(0,
"Try to recreate insert and log tables. The structure may have changed. See ChangeLog.");
45 static MYSQL_RES* mysql_select(
const Octstr *sql)
48 MYSQL_RES *result = NULL;
51 #if defined(SQLBOX_TRACE) 57 error(0,
"MYSQL: Database pool got no connection! DB update failed!");
63 error(0,
"MYSQL: %s", mysql_error(pc->
conn));
64 if (mysql_errno(pc->
conn) == MYSQL_ERR_NOSUCHFIELD) {
65 error(0,
"Try to recreate insert and log tables. The structure may have changed. See ChangeLog.");
68 result = mysql_store_result(pc->
conn);
76 void sqlbox_configure_mysql(
Cfg*
cfg)
82 panic(0,
"SQLBOX: MySQL: group 'sqlbox' is not specified!");
85 if (sqlbox_logtable == NULL) {
86 panic(0,
"No 'sql-log-table' not configured.");
89 if (sqlbox_insert_table == NULL) {
90 panic(0,
"No 'sql-insert-table' not configured.");
94 sql =
octstr_format(SQLBOX_MYSQL_CREATE_LOG_TABLE, sqlbox_logtable);
97 sql =
octstr_format(SQLBOX_MYSQL_CREATE_INSERT_TABLE, sqlbox_insert_table);
103 #define octstr_null_create(x) ((x != NULL) ? octstr_create(x) : octstr_create("")) 104 #define atol_null(x) ((x != NULL) ? atol(x) : -1) 105 Msg *mysql_fetch_msg()
112 sql =
octstr_format(SQLBOX_MYSQL_SELECT_QUERY, sqlbox_insert_table);
113 res = mysql_select(sql);
118 if (mysql_num_rows(res) >= 1) {
119 row = mysql_fetch_row(res);
120 id = octstr_null_create(row[0]);
124 msg->sms.foreign_id = octstr_null_create(row[0]);
125 msg->sms.sender = octstr_null_create(row[2]);
126 msg->sms.receiver = octstr_null_create(row[3]);
127 msg->sms.udhdata = octstr_null_create(row[4]);
128 msg->sms.msgdata = octstr_null_create(row[5]);
129 msg->sms.time = atol_null(row[6]);
130 msg->sms.smsc_id = octstr_null_create(row[7]);
131 msg->sms.service = octstr_null_create(row[8]);
132 msg->sms.account = octstr_null_create(row[9]);
133 msg->sms.sms_type = atol_null(row[11]);
134 msg->sms.mclass = atol_null(row[12]);
135 msg->sms.mwi = atol_null(row[13]);
136 msg->sms.coding = atol_null(row[14]);
137 msg->sms.compress = atol_null(row[15]);
138 msg->sms.validity = atol_null(row[16]);
139 msg->sms.deferred = atol_null(row[17]);
140 msg->sms.dlr_mask = atol_null(row[18]);
141 msg->sms.dlr_url = octstr_null_create(row[19]);
142 msg->sms.pid = atol_null(row[20]);
143 msg->sms.alt_dcs = atol_null(row[21]);
144 msg->sms.rpi = atol_null(row[22]);
145 msg->sms.charset = octstr_null_create(row[23]);
146 msg->sms.binfo = octstr_null_create(row[25]);
147 msg->sms.meta_data = octstr_null_create(row[26]);
148 msg->sms.priority = atol_null(row[27]);
149 if (row[24] == NULL) {
153 msg->sms.boxc_id= octstr_null_create(row[24]);
156 delet =
octstr_format(SQLBOX_MYSQL_DELETE_QUERY, sqlbox_insert_table,
id);
157 #if defined(SQLBOX_TRACE) 164 mysql_free_result(res);
170 int mysql_fetch_msg_list(
List *qlist,
long limit)
178 sql =
octstr_format(SQLBOX_MYSQL_SELECT_LIST_QUERY, sqlbox_insert_table, limit);
179 res = mysql_select(sql);
184 ret = mysql_num_rows(res);
186 while (row = mysql_fetch_row(res)) {
190 msg->sms.foreign_id = octstr_null_create(row[0]);
191 msg->sms.sender = octstr_null_create(row[2]);
192 msg->sms.receiver = octstr_null_create(row[3]);
193 msg->sms.udhdata = octstr_null_create(row[4]);
194 msg->sms.msgdata = octstr_null_create(row[5]);
195 msg->sms.time = atol_null(row[6]);
196 msg->sms.smsc_id = octstr_null_create(row[7]);
197 msg->sms.service = octstr_null_create(row[8]);
198 msg->sms.account = octstr_null_create(row[9]);
199 msg->sms.sms_type = atol_null(row[11]);
200 msg->sms.mclass = atol_null(row[12]);
201 msg->sms.mwi = atol_null(row[13]);
202 msg->sms.coding = atol_null(row[14]);
203 msg->sms.compress = atol_null(row[15]);
204 msg->sms.validity = atol_null(row[16]);
205 msg->sms.deferred = atol_null(row[17]);
206 msg->sms.dlr_mask = atol_null(row[18]);
207 msg->sms.dlr_url = octstr_null_create(row[19]);
208 msg->sms.pid = atol_null(row[20]);
209 msg->sms.alt_dcs = atol_null(row[21]);
210 msg->sms.rpi = atol_null(row[22]);
211 msg->sms.charset = octstr_null_create(row[23]);
212 msg->sms.binfo = octstr_null_create(row[25]);
213 msg->sms.meta_data = octstr_null_create(row[26]);
214 msg->sms.priority = atol_null(row[27]);
215 if (row[24] == NULL) {
219 msg->sms.boxc_id= octstr_null_create(row[24]);
224 mysql_free_result(res);
230 static Octstr *get_numeric_value_or_return_null(
long int num)
238 static Octstr *get_string_value_or_return_null(
Octstr *str)
252 #define st_num(x) (stuffer[stuffcount++] = get_numeric_value_or_return_null(x)) 253 #define st_str(x) (stuffer[stuffcount++] = get_string_value_or_return_null(x)) 261 sql =
octstr_format(SQLBOX_MYSQL_INSERT_QUERY, sqlbox_logtable, st_str(momt), st_str(
msg->sms.sender),
262 st_str(
msg->sms.receiver), st_str(
msg->sms.udhdata), st_str(
msg->sms.msgdata), st_num(
msg->sms.time),
263 st_str(
msg->sms.smsc_id), st_str(
msg->sms.service), st_str(
msg->sms.account), st_num(
msg->sms.sms_type),
264 st_num(
msg->sms.mclass), st_num(
msg->sms.mwi), st_num(
msg->sms.coding), st_num(
msg->sms.compress),
265 st_num(
msg->sms.validity), st_num(
msg->sms.deferred), st_num(
msg->sms.dlr_mask), st_str(
msg->sms.dlr_url),
266 st_num(
msg->sms.pid), st_num(
msg->sms.alt_dcs), st_num(
msg->sms.rpi), st_str(
msg->sms.charset),
267 st_str(
msg->sms.boxc_id), st_str(
msg->sms.binfo), st_str(
msg->sms.meta_data), st_num(
msg->sms.priority), st_str(
msg->sms.foreign_id));
269 while (stuffcount > 0) {
278 Octstr *sql, *values, *ids, *sep;
280 int stuffcount = 0, first = 1;
291 octstr_format_append(values,
"%S (NULL, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S, %S)",
292 sep, st_str(momt), st_str(
msg->sms.sender),
293 st_str(
msg->sms.receiver), st_str(
msg->sms.udhdata), st_str(
msg->sms.msgdata), st_num(
msg->sms.time),
294 st_str(
msg->sms.smsc_id), st_str(
msg->sms.service), st_str(
msg->sms.account), st_num(
msg->sms.sms_type),
295 st_num(
msg->sms.mclass), st_num(
msg->sms.mwi), st_num(
msg->sms.coding), st_num(
msg->sms.compress),
296 st_num(
msg->sms.validity), st_num(
msg->sms.deferred), st_num(
msg->sms.dlr_mask), st_str(
msg->sms.dlr_url),
297 st_num(
msg->sms.pid), st_num(
msg->sms.alt_dcs), st_num(
msg->sms.rpi), st_str(
msg->sms.charset),
298 st_str(
msg->sms.boxc_id), st_str(
msg->sms.binfo), st_str(
msg->sms.meta_data), st_num(
msg->sms.priority), st_str(
msg->sms.foreign_id));
306 while (stuffcount > 0) {
311 sql =
octstr_format(SQLBOX_MYSQL_INSERT_LIST_QUERY, sqlbox_logtable, values);
316 sql =
octstr_format(SQLBOX_MYSQL_DELETE_LIST_QUERY, sqlbox_insert_table, ids);
331 Octstr *mysql_host, *mysql_user, *mysql_pass, *mysql_db, *mysql_id;
333 long pool_size, mysql_port;
343 panic(0,
"SQLBOX: MySQL: group 'sqlbox' is not specified!");
346 panic(0,
"SQLBOX: MySQL: directive 'id' is not specified!");
364 panic(0,
"SQLBOX: MySQL: connection settings for id '%s' are not specified!",
375 panic(0,
"SQLBOX: MySQL: directive 'host' is not specified!");
377 panic(0,
"SQLBOX: MySQL: directive 'username' is not specified!");
379 panic(0,
"SQLBOX: MySQL: directive 'password' is not specified!");
381 panic(0,
"SQLBOX: MySQL: directive 'database' is not specified!");
387 db_conf = gw_malloc(
sizeof(
DBConf));
411 panic(0,
"SQLBOX: MySQL: 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_produce(List *list, void *item)
long gwlist_len(List *list)
#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)
void msg_destroy(Msg *msg)
Octstr * octstr_format(const char *fmt,...)
void octstr_destroy(Octstr *ostr)
#define octstr_create(cstr)
void dbpool_destroy(DBPool *p)
void * gwlist_consume(List *list)
void debug(const char *place, int err, const char *fmt,...)
int cfg_get_integer(long *n, CfgGroup *grp, Octstr *varname)
void octstr_format_append(Octstr *os, const char *fmt,...)
DBPoolConn * dbpool_conn_consume(DBPool *p)
CfgGroup * cfg_get_single_group(Cfg *cfg, Octstr *name)
static XMLRPCDocument * msg
void(* sql_save_msg)(Msg *, Octstr *)
void octstr_url_encode(Octstr *ostr)
int octstr_compare(const Octstr *ostr1, const Octstr *ostr2)
void gwlist_destroy(List *list, gwlist_item_destructor_t *destructor)