Hi again,

attached is the second version of this patch that fixes some stupid bugs...

P.S. seems nobody ever used 'dlr_flush_oracle' because table name was
hardcoded to 'DLR' ;)

Alexander Malysh wrote:

> Hi,
> 
> attched you can find patch that includes destination address into dlr
> lookup. This patch implements include all necessary changes for all dlr
> storage types. Additionally this patch changes my email addr. from
> @centrium.de to @kannel.org and does some cleanup for sql query
> generation.
> 
> What this patch try to do is pretty simple and I hope to be generic
> approach (picked from dlr.c):
> /*
>  * It's not possible to use the whole destination in sql query, so we just
>  * strip country prefix and do DB lookup like 'like "%striped-dst"' and so
>  * increase probability to find a right DB entry.
>  * Example: for Germany dst=+491711234567 striped=1711234567
>  * Example2: for Germany dst=01711234567 striped=1711234567
>  */
> 
> This approach was used at centrium for years and workes just fine...
> 
> Comments/votes please!
> 
> P.S. Patch is only compile tested, but should work (changes are trivial
> ;)).

-- 
Thanks,
Alex
Index: gw/dlr.c
===================================================================
RCS file: /home/cvs/gateway/gw/dlr.c,v
retrieving revision 1.51
diff -a -u -r1.51 dlr.c
--- gw/dlr.c	11 Aug 2004 16:41:29 -0000	1.51
+++ gw/dlr.c	25 Sep 2004 19:42:42 -0000
@@ -61,7 +61,7 @@
  *
  * Andreas Fink <[EMAIL PROTECTED]>, 18.08.2001
  * Stipe Tolj <[EMAIL PROTECTED]>, 22.03.2002
- * Alexander Malysh <[EMAIL PROTECTED]> 2003
+ * Alexander Malysh <[EMAIL PROTECTED]> 2003
  *
  * Changes:
  * 2001-12-17: [EMAIL PROTECTED]:
@@ -262,7 +262,7 @@
      * add aditional types here
      */
 
-     if (handles == NULL) {
+    if (handles == NULL) {
    	    panic(0, "DLR: storage type '%s' is not supported!", octstr_get_cstr(dlr_type));
     }
 
@@ -344,7 +344,8 @@
 
     debug("dlr.dlr", 0, "DLR[%s]: Adding DLR smsc=%s, ts=%s, src=%s, dst=%s, mask=%d, boxc=%s",
               dlr_type(), octstr_get_cstr(dlr->smsc), octstr_get_cstr(dlr->timestamp),
-              octstr_get_cstr(dlr->source), octstr_get_cstr(dlr->destination), dlr->mask, octstr_get_cstr(dlr->boxc_id));
+              octstr_get_cstr(dlr->source), octstr_get_cstr(dlr->destination), dlr->mask,
+              octstr_get_cstr(dlr->boxc_id));
 	
     /* call registered function */
     handles->dlr_add(dlr);
@@ -359,6 +360,7 @@
 {
     Msg	*msg = NULL;
     struct dlr_entry *dlr = NULL;
+    Octstr *striped_dst;
     
     if(octstr_len(smsc) == 0) {
 	warning(0, "DLR[%s]: Can't find a dlr without smsc-id", dlr_type());
@@ -369,15 +371,33 @@
     if (handles == NULL || handles->dlr_get == NULL)
         return NULL;
 
+
+    /*
+     * It's not possible to use the whole destination in sql query, so we just
+     * strip country prefix and do DB lookup like 'like "%striped-dst"' and so
+     * increase probability to find a right DB entry.
+     * Example: for Germany dst=+491711234567 striped=1711234567
+     * Example2: for Germany dst=01711234567 striped=1711234567
+     * Note: How many chars to strip should be probably configurable!
+     */
+    striped_dst = octstr_duplicate(dst);
+    if (octstr_len(dst) > 10)
+        octstr_delete(striped_dst, 0, octstr_len(dst) - 10);
+    else if (octstr_len(dst) > 7) /* fallback to 7 */
+        octstr_delete(striped_dst, 0, octstr_len(dst) - 7);
+        
+
     debug("dlr.dlr", 0, "DLR[%s]: Looking for DLR smsc=%s, ts=%s, dst=%s, type=%d",
-                                 dlr_type(), octstr_get_cstr(smsc), octstr_get_cstr(ts), octstr_get_cstr(dst), typ);
+        dlr_type(), octstr_get_cstr(smsc), octstr_get_cstr(ts), octstr_get_cstr(striped_dst), typ);
 
-    dlr = handles->dlr_get(smsc, ts, dst);
+    dlr = handles->dlr_get(smsc, ts, striped_dst);
     if (dlr == NULL)  {
         warning(0, "DLR[%s]: DLR for DST<%s> not found.",
-                      dlr_type(), octstr_get_cstr(dst));
+                      dlr_type(), octstr_get_cstr(striped_dst));
+        octstr_destroy(striped_dst);
         return NULL;
     }
+    octstr_destroy(striped_dst);
 
 #define O_SET(x, val) if (octstr_len(val) > 0) { x = val; val = NULL; }
 
@@ -407,7 +427,8 @@
         debug("dlr.dlr", 0, "DLR[%s]: created DLR message for URL <%s>",
                       dlr_type(), (msg->sms.dlr_url?octstr_get_cstr(msg->sms.dlr_url):""));
     } else {
-        debug("dlr.dlr", 0, "DLR[%s]: Ignoring DLR message because of mask type=%d dlr->mask=%d", dlr_type(), typ, dlr->mask);
+        debug("dlr.dlr", 0, "DLR[%s]: Ignoring DLR message because of mask type=%d dlr->mask=%d",
+            dlr_type(), typ, dlr->mask);
         /* ok that was a status report but we where not interested in having it */
         msg = NULL;
     }
@@ -419,11 +440,11 @@
         info(0, "DLR[%s]: DLR not destroyed, still waiting for other delivery report", dlr_type());
         /* update dlr entry status if function defined */
         if (handles != NULL && handles->dlr_update != NULL)
-            handles->dlr_update(smsc, ts, dst, typ);
+            handles->dlr_update(smsc, ts, dlr->destination, typ);
     } else {
         if (handles != NULL && handles->dlr_remove != NULL) {
             /* it's not good for internal storage, but better for all others */
-            handles->dlr_remove(smsc, ts, dst);
+            handles->dlr_remove(smsc, ts, dlr->destination);
         } else {
             warning(0, "DLR[%s]: Storage don't have remove operation defined", dlr_type());
         }
Index: gw/dlr.h
===================================================================
RCS file: /home/cvs/gateway/gw/dlr.h,v
retrieving revision 1.18
diff -a -u -r1.18 dlr.h
--- gw/dlr.h	22 Jan 2004 14:08:24 -0000	1.18
+++ gw/dlr.h	25 Sep 2004 19:42:42 -0000
@@ -61,6 +61,7 @@
  *
  * Andreas Fink <[EMAIL PROTECTED]>, 18.08.2001
  * Stipe Tolj <[EMAIL PROTECTED]>, 22.03.2002
+ * Alexander Malysh <[EMAIL PROTECTED]>, 2003
  */
 
 #ifndef	DLR_H
Index: gw/dlr_mem.c
===================================================================
RCS file: /home/cvs/gateway/gw/dlr_mem.c,v
retrieving revision 1.7
diff -a -u -r1.7 dlr_mem.c
--- gw/dlr_mem.c	8 Aug 2004 19:50:18 -0000	1.7
+++ gw/dlr_mem.c	25 Sep 2004 19:42:43 -0000
@@ -62,7 +62,7 @@
  *
  * Andreas Fink <[EMAIL PROTECTED]>, 18.08.2001
  * Stipe Tolj <[EMAIL PROTECTED]>, 22.03.2002
- * Alexander Malysh <[EMAIL PROTECTED]> 2003
+ * Alexander Malysh <[EMAIL PROTECTED]> 2003
  */
 
 #include "gwlib/gwlib.h"
@@ -125,7 +125,8 @@
     /* XXX: check destination addr too, because e.g. for UCP is not enough to check only
      *          smsc and timestamp (timestamp is even without milliseconds)
      */
-    if(octstr_compare(dlr->smsc,smsc) == 0 && octstr_compare(dlr->timestamp,ts) == 0)
+    if(octstr_compare(dlr->smsc,smsc) == 0 && octstr_compare(dlr->timestamp,ts) == 0 &&
+       octstr_search(dlr->destination, dst, 0) != -1)
         return 0;
 
     return 1;
Index: gw/dlr_mysql.c
===================================================================
RCS file: /home/cvs/gateway/gw/dlr_mysql.c,v
retrieving revision 1.7
diff -a -u -r1.7 dlr_mysql.c
--- gw/dlr_mysql.c	22 Jan 2004 14:08:24 -0000	1.7
+++ gw/dlr_mysql.c	25 Sep 2004 19:42:43 -0000
@@ -62,7 +62,7 @@
  *
  * Andreas Fink <[EMAIL PROTECTED]>, 18.08.2001
  * Stipe Tolj <[EMAIL PROTECTED]>, 22.03.2002
- * Alexander Malysh <[EMAIL PROTECTED]> 2003
+ * Alexander Malysh <[EMAIL PROTECTED]> 2003
 */
 
 #include "gwlib/gwlib.h"
@@ -144,17 +144,18 @@
 {
     Octstr *sql;
 
-    sql = octstr_format("INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES "
-                        "('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s', '%d');",
-                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
-                        octstr_get_cstr(fields->field_ts),
-                        octstr_get_cstr(fields->field_src), octstr_get_cstr(fields->field_dst),
-                        octstr_get_cstr(fields->field_serv), octstr_get_cstr(fields->field_url),
-                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_boxc),
-                        octstr_get_cstr(fields->field_status),
-                        octstr_get_cstr(entry->smsc), octstr_get_cstr(entry->timestamp), octstr_get_cstr(entry->source),
-                        octstr_get_cstr(entry->destination), octstr_get_cstr(entry->service), octstr_get_cstr(entry->url),
-                        entry->mask, octstr_get_cstr(entry->boxc_id), 0);
+    sql = octstr_format("INSERT INTO %S (%S, %S, %S, %S, %S, %S, %S, %S, %S) VALUES "
+                        "('%S', '%S', '%S', '%S', '%S', '%S', '%d', '%S', '%d');",
+                        fields->table, fields->field_smsc,
+                        fields->field_ts,
+                        fields->field_src, fields->field_dst,
+                        fields->field_serv, fields->field_url,
+                        fields->field_mask, fields->field_boxc,
+                        fields->field_status,
+                        entry->smsc, entry->timestamp,
+                        entry->source, entry->destination,
+                        entry->service, entry->url,
+                        entry->mask, entry->boxc_id, 0);
 
 
     mysql_update(sql);
@@ -170,12 +171,13 @@
     MYSQL_RES *result;
     MYSQL_ROW row;
 
-    sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s';",
-                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
-                        octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
-                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
-                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
-                        octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+    sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S' AND %S='%S' AND %S LIKE '%%%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,
+                        fields->field_dst, dst);
 
 
     result = mysql_select(sql);
@@ -191,7 +193,7 @@
     }
     row = mysql_fetch_row(result);
     if (!row) {
-        debug("dlr.mysql", 0, "rows found but could not load them");
+        debug("dlr.mysql", 0, "rows found but could not fetch them");
         mysql_free_result(result);
         return NULL;
     }
@@ -219,10 +221,10 @@
     Octstr *sql;
 
     debug("dlr.mysql", 0, "removing DLR from database");
-    sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' LIMIT 1;",
-                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
-                        octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
-
+    sql = octstr_format("DELETE FROM %S WHERE %S='%S' AND %S='%S' AND %S='%S' LIMIT 1;",
+                        fields->table, fields->field_smsc,
+                        smsc, fields->field_ts, ts,
+                        fields->field_dst, dst);
 
     mysql_update(sql);
 
@@ -234,11 +236,12 @@
     Octstr *sql;
 
     debug("dlr.mysql", 0, "updating DLR status in database");
-    sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' LIMIT 1;",
-                        octstr_get_cstr(fields->table),
-                        octstr_get_cstr(fields->field_status), status,
-                        octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
-                        octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+    sql = octstr_format("UPDATE %S SET %S=%d WHERE %S='%S' AND %S='%S' AND %S='%S' LIMIT 1;",
+                        fields->table,
+                        fields->field_status, status,
+                        fields->field_smsc, smsc,
+                        fields->field_ts, ts,
+                        fields->field_dst, dst);
 
     mysql_update(sql);
 
@@ -253,7 +256,7 @@
     MYSQL_RES *result;
     MYSQL_ROW row;
 
-    sql = octstr_format("SELECT count(*) FROM %s;", octstr_get_cstr(fields->table));
+    sql = octstr_format("SELECT count(*) FROM %S;", fields->table);
 
     result = mysql_select(sql);
     octstr_destroy(sql);
@@ -282,7 +285,7 @@
 {
     Octstr *sql;
 
-    sql = octstr_format("DELETE FROM %s;", octstr_get_cstr(fields->table));
+    sql = octstr_format("DELETE FROM %S;", fields->table);
 
     mysql_update(sql);
     octstr_destroy(sql);
Index: gw/dlr_oracle.c
===================================================================
RCS file: /home/cvs/gateway/gw/dlr_oracle.c,v
retrieving revision 1.6
diff -a -u -r1.6 dlr_oracle.c
--- gw/dlr_oracle.c	20 Mar 2004 19:48:22 -0000	1.6
+++ gw/dlr_oracle.c	25 Sep 2004 19:42:44 -0000
@@ -57,7 +57,7 @@
 /*
  * dlr_oracle.c - Oracle dlr storage implementation.
  *
- * Author: Alexander Malysh <[EMAIL PROTECTED]>, (C) 2003
+ * Author: Alexander Malysh <[EMAIL PROTECTED]>, (C) 2003
  * Robert Ga�ach <[EMAIL PROTECTED]>
  *      2004 Rewrited sql queries to use binding variables.
  *
@@ -210,7 +210,7 @@
     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",
+    sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S=:1 AND %S=:2 AND %S LIKE '%%:3' AND ROWNUM < 2",
                         fields->field_mask, fields->field_serv,
                         fields->field_url, fields->field_src,
                         fields->field_dst, fields->field_boxc,
@@ -300,7 +300,7 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("DELETE FROM DLR");
+    sql = octstr_format("DELETE FROM %S", fields->table);
 #if defined(DLR_TRACE)
     debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql));
 #endif
Index: gw/dlr_pgsql.c
===================================================================
RCS file: /home/cvs/gateway/gw/dlr_pgsql.c,v
retrieving revision 1.1
diff -a -u -r1.1 dlr_pgsql.c
--- gw/dlr_pgsql.c	9 Jun 2004 10:06:33 -0000	1.1
+++ gw/dlr_pgsql.c	25 Sep 2004 19:42:45 -0000
@@ -62,7 +62,7 @@
  *
  * modeled after dlr_mysql.c
  *
- * Alexander Malysh <[EMAIL PROTECTED]>, cleanup 2004
+ * Alexander Malysh <[EMAIL PROTECTED]>, cleanup 2004
  */
 
 #include "gwlib/gwlib.h"
@@ -138,17 +138,17 @@
 {
     Octstr *sql;
 
-    sql = octstr_format("INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES "
-                        "('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s', '%d');",
-                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
-                        octstr_get_cstr(fields->field_ts),
-                        octstr_get_cstr(fields->field_src), octstr_get_cstr(fields->field_dst),
-                        octstr_get_cstr(fields->field_serv), octstr_get_cstr(fields->field_url),
-                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_boxc),
-                        octstr_get_cstr(fields->field_status),
-                        octstr_get_cstr(entry->smsc), octstr_get_cstr(entry->timestamp), octstr_get_cstr(entry->source),
-                        octstr_get_cstr(entry->destination), octstr_get_cstr(entry->service), octstr_get_cstr(entry->url),
-                        entry->mask, octstr_get_cstr(entry->boxc_id), 0);
+    sql = octstr_format("INSERT INTO %S (%S, %S, %S, %S, %S, %S, %S, %S, %S) VALUES "
+                        "('%S', '%S', '%S', '%S', '%S', '%S', '%d', '%S', '%d');",
+                        fields->table, fields->field_smsc,
+                        fields->field_ts,
+                        fields->field_src, fields->field_dst,
+                        fields->field_serv, fields->field_url,
+                        fields->field_mask, fields->field_boxc,
+                        fields->field_status,
+                        entry->smsc, entry->timestamp, entry->source,
+                        entry->destination, entry->service, entry->url,
+                        entry->mask, entry->boxc_id, 0);
 
 
     pgsql_update(sql);
@@ -163,12 +163,13 @@
     Octstr *sql;
     List *result, *row;
 
-    sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s';",
-                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
-                        octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
-                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
-                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
-                        octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+    sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S' AND %S='%S' AND %S LIKE '%%%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,
+                        fields->field_dst, dst);
 
 
     result = pgsql_select(sql);
@@ -190,8 +191,7 @@
 		    octstr_get_cstr(list_get(row, 2)),
 		    octstr_get_cstr(list_get(row, 3)),
 		    octstr_get_cstr(list_get(row, 4)),
-		    octstr_get_cstr(list_get(row, 5))
-	 );
+		    octstr_get_cstr(list_get(row, 5)));
 
     res = dlr_entry_create();
     gw_assert(res != NULL);
@@ -215,9 +215,9 @@
     Octstr *sql;
 
     debug("dlr.pgsql", 0, "removing DLR from database");
-    sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' LIMIT 1;",
-                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
-                        octstr_get_cstr(smsc), octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+    sql = octstr_format("DELETE FROM %S WHERE %S='%S' AND %S='%S' AND %S='%S' LIMIT 1;",
+                        fields->table, fields->field_smsc,
+                        smsc, fields->field_ts, ts, fields->field_dst, dst);
 
 
     pgsql_update(sql);
@@ -229,11 +229,11 @@
     Octstr *sql;
 
     debug("dlr.pgsql", 0, "updating DLR status in database");
-    sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' LIMIT 1;",
-                        octstr_get_cstr(fields->table),
-                        octstr_get_cstr(fields->field_status), status,
-                        octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
-                        octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+    sql = octstr_format("UPDATE %S SET %S=%d WHERE %S='%S' AND %S='%S' AND %S='%S' LIMIT 1;",
+                        fields->table,
+                        fields->field_status, status,
+                        fields->field_smsc, smsc,
+                        fields->field_ts, ts, fields->field_dst, dst);
     pgsql_update(sql);
     octstr_destroy(sql);
 }
@@ -245,7 +245,7 @@
     long ret;
     List *res;
 
-    sql = octstr_format("SELECT count(*) FROM %s;", octstr_get_cstr(fields->table));
+    sql = octstr_format("SELECT count(*) FROM %S;", fields->table);
 
     res = pgsql_select(sql);
     octstr_destroy(sql);
@@ -267,7 +267,7 @@
 {
     Octstr *sql;
 
-    sql = octstr_format("DELETE FROM %s;", octstr_get_cstr(fields->table));
+    sql = octstr_format("DELETE FROM %S;", fields->table));
 
     pgsql_update(sql);
     octstr_destroy(sql);
Index: gw/dlr_sdb.c
===================================================================
RCS file: /home/cvs/gateway/gw/dlr_sdb.c,v
retrieving revision 1.9
diff -a -u -r1.9 dlr_sdb.c
--- gw/dlr_sdb.c	18 May 2004 13:04:20 -0000	1.9
+++ gw/dlr_sdb.c	25 Sep 2004 19:42:46 -0000
@@ -62,7 +62,7 @@
  *
  * Andreas Fink <[EMAIL PROTECTED]>, 18.08.2001
  * Stipe Tolj <[EMAIL PROTECTED]>, 22.03.2002
- * Alexander Malysh <[EMAIL PROTECTED]> 2003
+ * Alexander Malysh <[EMAIL PROTECTED]> 2003
  * Guillaume Cottenceau 2004 (dbpool support)
 */
 
@@ -137,18 +137,18 @@
     Octstr *sql;
     int	state;
 
-    sql = octstr_format("INSERT INTO %s (%s, %s, %s, %s, %s, %s, %s, %s, %s) VALUES "
-                        "('%s', '%s', '%s', '%s', '%s', '%s', '%d', '%s', '%d')",
-                        octstr_get_cstr(fields->table), octstr_get_cstr(fields->field_smsc),
-                        octstr_get_cstr(fields->field_ts),
-                        octstr_get_cstr(fields->field_src), octstr_get_cstr(fields->field_dst),
-                        octstr_get_cstr(fields->field_serv), octstr_get_cstr(fields->field_url),
-                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_boxc),
-                        octstr_get_cstr(fields->field_status),
-                        octstr_get_cstr(dlr->smsc), octstr_get_cstr(dlr->timestamp),
-                        octstr_get_cstr(dlr->source), octstr_get_cstr(dlr->destination),
-                        octstr_get_cstr(dlr->service), octstr_get_cstr(dlr->url), dlr->mask,
-                        octstr_get_cstr(dlr->boxc_id), 0);
+    sql = octstr_format("INSERT INTO %S (%S, %S, %S, %S, %S, %S, %S, %S, %S) VALUES "
+                        "('%S', '%S', '%S', '%S', '%S', '%S', '%d', '%S', '%d')",
+                        fields->table, fields->field_smsc,
+                        fields->field_ts,
+                        fields->field_src, fields->field_dst,
+                        fields->field_serv, fields->field_url,
+                        fields->field_mask, fields->field_boxc,
+                        fields->field_status,
+                        dlr->smsc, dlr->timestamp,
+                        dlr->source, dlr->destination,
+                        dlr->service, dlr->url, dlr->mask,
+                        dlr->boxc_id, 0);
 
 #if defined(DLR_TRACE)
      debug("dlr.sdb", 0, "SDB: sql: %s", octstr_get_cstr(sql));
@@ -216,13 +216,15 @@
 
     gw_assert(res != NULL);
 
-    sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' %s",
-                        octstr_get_cstr(fields->field_mask), octstr_get_cstr(fields->field_serv),
-                        octstr_get_cstr(fields->field_url), octstr_get_cstr(fields->field_src),
-                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(fields->field_boxc),
-                        octstr_get_cstr(fields->table),
-                        octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
-                        octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
+    sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S' AND %S='%S' AND %S LIKE '%%%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,
+                        fields->field_dst, dst,
+                        sdb_get_limit_str());
 
 #if defined(DLR_TRACE)
      debug("dlr.sdb", 0, "SDB: sql: %s", octstr_get_cstr(sql));
@@ -254,11 +256,13 @@
     int	state;
 
     debug("dlr.sdb", 0, "SDB: updating DLR status in database");
-    sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND %s='%s' %s",
-                        octstr_get_cstr(fields->table),
-                        octstr_get_cstr(fields->field_status), status,
-                        octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
-                        octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
+    sql = octstr_format("UPDATE %S SET %S=%d WHERE %S='%S' AND %S='%S' AND %S='%S' %s",
+                        fields->table,
+                        fields->field_status, status,
+                        fields->field_smsc, smsc,
+                        fields->field_ts, ts,
+                        fields->field_dst, dst,
+                        sdb_get_limit_str());
 
 #if defined(DLR_TRACE)
      debug("dlr.sdb", 0, "SDB: sql: %s", octstr_get_cstr(sql));
@@ -285,17 +289,20 @@
          * to do vacuum regularly, even if it's virtually impossible
          * to hit duplicates since oid's are given in a row
          */
-        sql = octstr_format("DELETE FROM %s WHERE oid = \
-                            (SELECT oid FROM %s WHERE %s='%s' AND %s='%s' LIMIT 1)",
-                            octstr_get_cstr(fields->table),
-                            octstr_get_cstr(fields->table),
-                            octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
-                            octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts));
+        sql = octstr_format("DELETE FROM %S WHERE " 
+                            "oid = (SELECT oid FROM %S WHERE %S='%S' AND %S='%S' AND %S='%S' LIMIT 1)",
+                            fields->table,
+                            fields->table,
+                            fields->field_smsc, smsc,
+                            fields->field_ts, ts,
+                            fields->field_dst, dst);
     } else {
-        sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' %s",
-                            octstr_get_cstr(fields->table),
-                            octstr_get_cstr(fields->field_smsc), octstr_get_cstr(smsc),
-                            octstr_get_cstr(fields->field_ts), octstr_get_cstr(ts), sdb_get_limit_str());
+        sql = octstr_format("DELETE FROM %S WHERE %S='%S' AND %S='%S' AND %S='%S' %s",
+                            fields->table,
+                            fields->field_smsc, smsc,
+                            fields->field_ts, ts,
+                            fields->field_dst, dst,
+                            sdb_get_limit_str());
     }
 
 #if defined(DLR_TRACE)
@@ -314,7 +321,7 @@
     int	state;
     long res = 0;
 
-    sql = octstr_format("SELECT count(*) FROM %s", octstr_get_cstr(fields->table));
+    sql = octstr_format("SELECT count(*) FROM %S", fields->table);
 
 #if defined(DLR_TRACE)
     debug("dlr.sdb", 0, "sql: %s", octstr_get_cstr(sql));
@@ -335,7 +342,7 @@
     Octstr *sql;
     int	state;
 
-    sql = octstr_format("DELETE FROM %s", octstr_get_cstr(fields->table));
+    sql = octstr_format("DELETE FROM %S", fields->table);
 
 #if defined(DLR_TRACE)
      debug("dlr.sdb", 0, "sql: %s", octstr_get_cstr(sql));

Reply via email to