static long dlr_redis_messages(void) { List *result, *row; DBPoolConn *conn; long msgs = -1; conn = dbpool_conn_consume(pool); if (conn == NULL) return -1; if (dbpool_conn_select(conn, octstr_imm("DBSIZE"), NULL, &result) != 0) { dbpool_conn_produce(conn); return 0; } dbpool_conn_produce(conn); if (gwlist_len(result) > 0) { row = gwlist_extract_first(result); msgs = atol(octstr_get_cstr(gwlist_get(row, 0))); gwlist_destroy(row, octstr_destroy_item); while ((row = gwlist_extract_first(result)) != NULL) gwlist_destroy(row, octstr_destroy_item); } gwlist_destroy(result, NULL); return msgs; }
static long dlr_messages_oracle() { List *result, *row; Octstr *sql; DBPoolConn *conn; long msgs = -1; conn = dbpool_conn_consume(pool); if (conn == NULL) return -1; sql = octstr_format("SELECT count(*) FROM %S", fields->table); #if defined(DLR_TRACE) debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql)); #endif if (dbpool_conn_select(conn, sql, NULL, &result) != 0) { octstr_destroy(sql); dbpool_conn_produce(conn); return -1; } dbpool_conn_produce(conn); octstr_destroy(sql); if (gwlist_len(result) > 0) { row = gwlist_extract_first(result); msgs = strtol(octstr_get_cstr(gwlist_get(row,0)), NULL, 10); gwlist_destroy(row, octstr_destroy_item); } gwlist_destroy(result, NULL); return msgs; }
static void oracle_client_thread(void *arg) { DBPool *pool = arg; DBPoolConn *pconn = NULL; int i; List *result; for (i = 1; i <= queries; i++) { pconn = dbpool_conn_consume(pool); if (pconn == NULL) continue; #if 1 /* selects */ if (dbpool_conn_select(pconn, sql, NULL, &result) == 0) { long i,j; for (i=0; i < gwlist_len(result); i++) { List *row = gwlist_get(result, i); for (j=0; j < gwlist_len(row); j++) debug("", 0, "col = %ld value = '%s'", j, octstr_get_cstr(gwlist_get(row,j))); gwlist_destroy(row, octstr_destroy_item); } } gwlist_destroy(result, NULL); dbpool_conn_produce(pconn); #else /* only updates */ debug("", 0, "rows processed = %d ", dbpool_conn_update(pconn, sql, NULL)); dbpool_conn_produce(pconn); #endif } }
static struct dlr_entry* dlr_get_oracle(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { Octstr *sql; DBPoolConn *pconn; List *result = NULL, *row; struct dlr_entry *res = NULL; List *binds = gwlist_create(); pconn = dbpool_conn_consume(pool); if (pconn == NULL) /* should not happens, but sure is sure */ return NULL; sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S=:1 AND %S=:2 AND %S=:3 AND ROWNUM < 2", fields->field_mask, fields->field_serv, fields->field_url, fields->field_src, fields->field_dst, fields->field_boxc, fields->table, fields->field_smsc, fields->field_ts, fields->field_dst); gwlist_append(binds, (Octstr *)smsc); /* :1 */ gwlist_append(binds, (Octstr *)ts); /* :2 */ gwlist_append(binds, (Octstr *)dst); /* :3 */ #if defined(DLR_TRACE) debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql)); #endif if (dbpool_conn_select(pconn, sql, binds, &result) != 0) { octstr_destroy(sql); dbpool_conn_produce(pconn); return NULL; } octstr_destroy(sql); gwlist_destroy(binds, NULL); dbpool_conn_produce(pconn); #define LO2CSTR(r, i) octstr_get_cstr(gwlist_get(r, i)) if (gwlist_len(result) > 0) { row = gwlist_extract_first(result); res = dlr_entry_create(); gw_assert(res != NULL); res->mask = atoi(LO2CSTR(row,0)); res->service = octstr_create(LO2CSTR(row, 1)); res->url = octstr_create(LO2CSTR(row,2)); res->source = octstr_create(LO2CSTR(row, 3)); res->destination = octstr_create(LO2CSTR(row, 4)); res->boxc_id = octstr_create(LO2CSTR(row, 5)); gwlist_destroy(row, octstr_destroy_item); res->smsc = octstr_duplicate(smsc); } gwlist_destroy(result, NULL); #undef LO2CSTR return res; }
static struct dlr_entry* dlr_get_mssql(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { Octstr *sql, *like; DBPoolConn *pconn; List *result = NULL, *row; struct dlr_entry *res = NULL; pconn = dbpool_conn_consume(pool); if (pconn == NULL) /* should not happens, but sure is sure */ return NULL; if (dst) like = octstr_format("AND %S LIKE '%%%S'", fields->field_dst, dst); else like = octstr_imm(""); sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S'" " AND %S='%S' %S", fields->field_mask, fields->field_serv, fields->field_url, fields->field_src, fields->field_dst, fields->field_boxc, fields->table, fields->field_smsc, smsc, fields->field_ts, ts, like); #if defined(DLR_TRACE) debug("dlr.mssql", 0, "sql: %s", octstr_get_cstr(sql)); #endif if (dbpool_conn_select(pconn, sql, NULL, &result) != 0) { octstr_destroy(sql); dbpool_conn_produce(pconn); return NULL; } octstr_destroy(sql); octstr_destroy(like); dbpool_conn_produce(pconn); #define LO2CSTR(r, i) octstr_get_cstr(gwlist_get(r, i)) if (gwlist_len(result) > 0) { row = gwlist_extract_first(result); res = dlr_entry_create(); gw_assert(res != NULL); res->mask = atoi(LO2CSTR(row,0)); res->service = octstr_create(LO2CSTR(row, 1)); res->url = octstr_create(LO2CSTR(row,2)); res->source = octstr_create(LO2CSTR(row, 3)); res->destination = octstr_create(LO2CSTR(row, 4)); res->boxc_id = octstr_create(LO2CSTR(row, 5)); gwlist_destroy(row, octstr_destroy_item); res->smsc = octstr_duplicate(smsc); } gwlist_destroy(result, NULL); #undef LO2CSTR return res; }
static inline List *pgsql_select(const Octstr *sql) { DBPoolConn *pc; List *ret = NULL; #if defined(DLR_TRACE) debug("dlr.pgsql", 0, "sql: %s", octstr_get_cstr(sql)); #endif pc = dbpool_conn_consume(pool); if (pc == NULL) { error(0, "PGSQL: Database pool got no connection! DB operation failed!"); return NULL; } if (dbpool_conn_select(pc, sql, NULL, &ret) == -1) error(0, "PGSQL: Select failed!"); dbpool_conn_produce(pc); return ret; }
static struct dlr_entry *dlr_redis_get(const Octstr *smsc, const Octstr *ts, const Octstr *dst) { Octstr *key, *sql; DBPoolConn *pconn; List *binds = gwlist_create(); List *result = NULL, *row; struct dlr_entry *res = NULL; pconn = dbpool_conn_consume(pool); if (pconn == NULL) { error(0, "DLR: REDIS: No connection available"); gwlist_destroy(binds, NULL); dbpool_conn_produce(pconn); return NULL; } /* If the destination address is not NULL, then * it has been shortened by the abstractive layer. */ key = octstr_format((dst ? "%S:?:?:?" : "%S:?:?"), fields->table); sql = octstr_format("HMGET %S ? ? ? ? ? ?", key); gwlist_append(binds, (Octstr *)smsc); /* key */ gwlist_append(binds, (Octstr *)ts); /* key */ if (dst) gwlist_append(binds, (Octstr *)dst); /* key */ gwlist_append(binds, fields->field_mask); gwlist_append(binds, fields->field_serv); gwlist_append(binds, fields->field_url); gwlist_append(binds, fields->field_src); gwlist_append(binds, fields->field_dst); gwlist_append(binds, fields->field_boxc); if (dbpool_conn_select(pconn, sql, binds, &result) != 0) { error(0, "DLR: REDIS: Failed to fetch DLR for %s", octstr_get_cstr(key)); octstr_destroy(sql); octstr_destroy(key); gwlist_destroy(binds, NULL); dbpool_conn_produce(pconn); return NULL; } dbpool_conn_produce(pconn); octstr_destroy(sql); octstr_destroy(key); gwlist_destroy(binds, NULL); #define LO2CSTR(r, i) octstr_get_cstr(gwlist_get(r, i)) if (gwlist_len(result) > 0) { row = gwlist_extract_first(result); /* * If we get an empty set back from redis, this is * still an array with "" values, representing (nil). * If the mask is empty then this can't be a valid * set, therefore bail out. */ if (octstr_len(gwlist_get(row, 0)) > 0) { res = dlr_entry_create(); gw_assert(res != NULL); res->mask = atoi(octstr_get_cstr(gwlist_get(row, 0))); get_octstr_value(&res->service, row, 1); get_octstr_value(&res->url, row, 2); octstr_url_decode(res->url); get_octstr_value(&res->source, row, 3); get_octstr_value(&res->destination, row, 4); get_octstr_value(&res->boxc_id, row, 5); res->smsc = octstr_duplicate(smsc); octstr_replace(res->source, octstr_imm("__space__"), octstr_imm(" ")); octstr_replace(res->destination, octstr_imm("__space__"), octstr_imm(" ")); } gwlist_destroy(row, octstr_destroy_item); } gwlist_destroy(result, NULL); #undef LO2CSTR return res; }