Patch: EMI UUCP DLR

"Nikos Balkanas" <[email protected]>
Newsgroups gmane.comp.mobile.kannel.devel
Message-ID <1E4EAA0E6432471D9F4F53599254EDDE@drwho>
Hi,

This patch to dlr_mysql, dlr_pgsql, dlr_oracle, dlr_mssql, dlr_mem & dlr_sdb 
adds support for destination number on dlr_get, dlr_remove & dlr_update. 
This is to fix a long known issue with EMI DLRs, where they use non-unique 
ts (timestamp) and kannel mismatches DLRs. It compiles clean, but I cannot 
test it.

Notes:

1) It needs dst NULL if it doesn't exist (some SMScs don't include it in 
DLRs). Going through the code this is valid for smpp & EMI.
2) dlr_oracle.c already had implemented dst in querries. How come it didn't 
conflict with said SMScs? Aligned it with rest.
3) There is no dlr_mem_update. Shouldn't there be?

@Luis: Could you please test it?

BR,
Nikos
----- Original Message ----- 
From: Luis Tiago Rico
To: [email protected]
Sent: Monday, June 14, 2010 12:28 PM
Subject: RE: DLR matches wrong message


This is a known problem to Kannel.
Kannel, using EMI connection, cannot guarantee DLR matching of messages sent 
at the same timestamp.

Why?
Because it does not compare the MSISDN! It only queries DLR β€database’, 
with the timestamp (even that is not in milliseconds) and SMSC.
I think there is a patch for this problem (don’t know where). Or if you 
manage, you can change the Kannel source code, and add the MSISDN to the 
database query…. Some of these days I will have to do it for myself.

And why this haven’t been included in the last release?
Because this does not work for all SMSC. Not all of them send back the 
MSISDN…

Hope my explanation was correct!

Best Regards,
Tiago Rico

From: [email protected] [mailto:[email protected]] On Behalf 
Of Konstantin Vayner
Sent: segunda-feira, 14 de Junho de 2010 09:04
To: Kannel Users
Subject: DLR matches wrong message

Hi everyone,

I'm using emi/ucp smsc under kannel 1.4.3. Here's smsc group configuration 
(sensitive information masked):

group = smsc
smsc = emi
smsc-id = ucp_smsc
log-file = "/var/log/kannel/ucp_smsc.log"
log-level = 0
host = 1.2.3.4
port = 1234
smsc-username = "678"
smsc-password = XYZPWZYX
keepalive = 50
idle-timeout = 60
source-addr-autodetect = yes
allowed-smsc-id = ucp_smsc
flow-control = 1
throughput = 8

The problem is: messages sent on same timestamp mix up in DLRs even though 
they are sent to different destinations. E.g. sending to X and Y at the same 
time makes kannel send both DLRs to a dlr-url supplied for X.

Here's the log:

2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: emi2 parsing packet: 
< 04/00043/R/51/A//0541234567:130610111626/43 >
2010-06-13 11:15:33 [8444] [16] DEBUG: DLR[internal]: Adding DLR 
smsc=ucp_smsc, ts=130610111626, src=031111111, dst=0541234567, mask=31, 
boxc=
2010-06-13 11:15:33 [8444] [16] DEBUG: SMSC[ucp_smsc]: creating DLR message
2010-06-13 11:15:33 [8444] [16] DEBUG: SMSC[ucp_smsc]: DLR = 
http://127.0.0.1/imsc/interfaces/kannel_http/dlr.php?msg_id=32490951&dlr=%d&reason=%A
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: Got packet from the 
main socket
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: emi2 parsing packet: 
< 
73/00239/O/53/678/0541234567/////////////130610111626/1/107/130610111626/3//4D65737361676520666F7220303534343937363830352C2077697468206964656E74696669636174696F6E2031303036313331313136323620686173206265656E206275666665726564/////////////F4 
 >
2010-06-13 11:15:33 [8444] [16] DEBUG: DLR[internal]: Looking for DLR 
smsc=ucp_smsc, ts=130610111626, dst=0541234567, type=4
2010-06-13 11:15:33 [8444] [16] DEBUG: DLR[internal]: created DLR message 
for URL 
<http://127.0.0.1/imsc/interfaces/kannel_http/dlr.php?msg_id=32490951&dlr=%d&reason=%A>
2010-06-13 11:15:33 [8444] [16] DEBUG: DLR[internal]: DLR not destroyed, 
still waiting for other delivery report
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: emi2 sending packet: 
< 73/00020/R/53/A///A0 >
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: emi2 sending packet: 
< 
05/00376/O/51/0549988770/036532407//1//7///////1306102100//////4/1072/005400530054002D0042005A003A000A05D905EA05E805EA002005E405D905E705D305D505E005D505EA000A05D105E105DA000A0032002C003400330036002C003000350036002E00320032002005E905D7000A00310033002F00300036002000310031003A00310033002000680074007400700073003A002F002F007700770077002E0070////1//////0106050003030201020108///3F 
 >
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: Got packet from the 
main socket
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: emi2 parsing packet: 
< 05/00043/R/51/A//0549988770:130610111626/46 >
2010-06-13 11:15:33 [8444] [16] DEBUG: DLR[internal]: Adding DLR 
smsc=ucp_smsc, ts=130610111626, src=032222222, dst=0549988770, mask=31, 
boxc=
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: emi2 sending packet: 
< 
06/00182/O/51/0549988770/036532407///////////1306102100//////4/0304/006100790070006F0061006C0069006D002E0063006F002E0069006C002F00620061006E006B////1//////0106050003030202020108///B4 
 >
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: Got packet from the 
main socket
2010-06-13 11:15:33 [8444] [16] DEBUG: EMI2[ucp_smsc]: emi2 parsing packet: 
< 06/00043/R/51/A//0549988770:130610111627/48 >
2010-06-13 11:15:33 [8444] [16] DEBUG: SMSC[ucp_smsc]: creating DLR message
2010-06-13 11:15:33 [8444] [16] DEBUG: SMSC[ucp_smsc]: DLR = 
http://127.0.0.1/imsc/interfaces/kannel_http/dlr.php?msg_id=32490499&dlr=%d&reason=%A
**this one is still correct**

... and then, a few seconds later ...

2010-06-13 11:15:46 [8444] [16] DEBUG: EMI2[ucp_smsc]: emi2 parsing packet: 
< 
89/00295/O/53/678/0549988770/////////////130610111626/0/000/130610111638/3//4D65737361676520666F7220303534343937333538352C2077697468206964656E74696669636174696F6E2031303036313331313136323620686173206265656E2064656C697665726564206F6E20323031302D30362D31332061742031313A31363A33382E/////////////A0 
 >
2010-06-13 11:15:46 [8444] [16] DEBUG: DLR[internal]: Looking for DLR 
smsc=ucp_smsc, ts=130610111626, dst=0549988770, type=1
2010-06-13 11:15:46 [8444] [16] DEBUG: DLR[internal]: created DLR message 
for URL 
<http://127.0.0.1/imsc/interfaces/kannel_http/dlr.php?msg_id=32490951&dlr=%d&reason=%A>
**this one went out to a dlr-url of wrong message**
kannel.diff (application/octet-stream, 19 KB)
Index: gw/dlr_mem.c
===================================================================
--- gw/dlr_mem.c	(revision 4833)
+++ gw/dlr_mem.c	(working copy)
@@ -125,7 +125,7 @@
     /* 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 && (!dst || octstr_compare(dlr->destination,dst) == 0))
         return 0;
 
     return 1;
Index: gw/dlr_mssql.c
===================================================================
--- gw/dlr_mssql.c	(revision 4833)
+++ gw/dlr_mssql.c	(working copy)
@@ -172,7 +172,12 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("SET ROWCOUNT 1\n"
+    if (dst) sql = octstr_format("SET ROWCOUNT 1\n"
+            "DELETE FROM %S WHERE %S='%S' AND %S='%S' AND %S='%S'\n"
+            "SET ROWCOUNT 0",
+            fields->table, fields->field_smsc, smsc,
+            fields->field_ts, ts, fields->field_dst, dst);
+    else sql = octstr_format("SET ROWCOUNT 1\n"
             "DELETE FROM %S WHERE %S='%S' AND %S='%S'\n"
             "SET ROWCOUNT 0",
             fields->table, fields->field_smsc, smsc,
@@ -202,9 +207,14 @@
     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='%S' AND %S='%S'",
+    if (dst) sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S' AND %S='%S' AND %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);
+    else sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S='%S' AND %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);
 
 #if defined(DLR_TRACE)
@@ -253,7 +263,13 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("SET ROWCOUNT 1\n"
+    if (dst) sql = octstr_format("SET ROWCOUNT 1\n"
+            "UPDATE %S SET %S=%d WHERE %S='%S' AND %S='%S' AND %S='%S'\n"
+            "SET ROWCOUNT 0",
+            fields->table, fields->field_status, status,
+            fields->field_smsc, smsc, fields->field_ts, ts, fields->field_dst,
+            dst);
+    else sql = octstr_format("SET ROWCOUNT 1\n"
             "UPDATE %S SET %S=%d WHERE %S='%S' AND %S='%S'\n"
             "SET ROWCOUNT 0",
             fields->table, fields->field_status, status,
Index: gw/dlr_mysql.c
===================================================================
--- gw/dlr_mysql.c	(revision 4833)
+++ gw/dlr_mysql.c	(working copy)
@@ -148,15 +148,22 @@
     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`=? AND `%S`=? LIMIT 1",
+    if (dst) sql = octstr_format("SELECT `%S`, `%S`, `%S`, `%S`, `%S`, `%S` FROM `%S` WHERE `%S`=? AND `%S`=? AND `%S`=? LIMIT 1",
                         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);
+    else sql = octstr_format("SELECT `%S`, `%S`, `%S`, `%S`, `%S`, `%S` FROM `%S` WHERE `%S`=? AND `%S`=? LIMIT 1",
+                        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);
 
     gwlist_append(binds, (Octstr *)smsc);
     gwlist_append(binds, (Octstr *)ts);
+    if (dst) gwlist_append(binds, (Octstr *)dst);
 
 #if defined(DLR_TRACE)
     debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
@@ -207,12 +214,17 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("DELETE FROM `%S` WHERE `%S`=? AND `%S`=? LIMIT 1",
+    if (dst) sql = octstr_format("DELETE FROM `%S` WHERE `%S`=? AND `%S`=? AND "
+        "`%S`=? LIMIT 1",
                         fields->table, fields->field_smsc,
+                        fields->field_ts, fields->field_dst);
+    else sql = octstr_format("DELETE FROM `%S` WHERE `%S`=? AND `%S`=? LIMIT 1",
+                        fields->table, fields->field_smsc,
                         fields->field_ts);
 
     gwlist_append(binds, (Octstr *)smsc);
     gwlist_append(binds, (Octstr *)ts);
+    if (dst) gwlist_append(binds, (Octstr *)dst);
 
 #if defined(DLR_TRACE)
     debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
@@ -242,14 +254,20 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("UPDATE `%S` SET `%S`=? WHERE `%S`=? AND `%S`=? LIMIT 1",
+    if (dst) sql = octstr_format("UPDATE `%S` SET `%S`=? WHERE `%S`=? AND "
+        "`%S`=? AND `%S`=? LIMIT 1",
                         fields->table, fields->field_status,
+                        fields->field_smsc, fields->field_ts,
+                        fields->field_dst);
+    else sql = octstr_format("UPDATE `%S` SET `%S`=? WHERE `%S`=? AND `%S`=? LIMIT 1",
+                        fields->table, fields->field_status,
                         fields->field_smsc, fields->field_ts);
 
     os_status = octstr_format("%d", status);
     gwlist_append(binds, (Octstr *)os_status);
     gwlist_append(binds, (Octstr *)smsc);
     gwlist_append(binds, (Octstr *)ts);
+    if (dst) gwlist_append(binds, (Octstr *)dst);
 
 #if defined(DLR_TRACE)
     debug("dlr.mysql", 0, "sql: %s", octstr_get_cstr(sql));
Index: gw/dlr_oracle.c
===================================================================
--- gw/dlr_oracle.c	(revision 4833)
+++ gw/dlr_oracle.c	(working copy)
@@ -183,13 +183,15 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("DELETE FROM %S WHERE %S=:1 AND %S=:2 AND %S=:3 AND ROWNUM < 2",
+    if (dst) sql = octstr_format("DELETE FROM %S WHERE %S=:1 AND %S=:2 AND %S=:3 AND ROWNUM < 2",
                         fields->table, fields->field_smsc,
                         fields->field_ts, fields->field_dst);
+    else sql = octstr_format("DELETE FROM %S WHERE %S=:1 AND %S=:2 AND ROWNUM < 2",
+                        fields->table, fields->field_smsc, fields->field_ts);
 
-    gwlist_append(binds, (Octstr *)smsc);      /* :1 */
-    gwlist_append(binds, (Octstr *)ts);        /* :2 */
-    gwlist_append(binds, (Octstr *)dst);       /* :3 */
+    gwlist_append(binds, (Octstr *)smsc);               /* :1 */
+    gwlist_append(binds, (Octstr *)ts);                 /* :2 */
+    if (dst) gwlist_append(binds, (Octstr *)dst);       /* :3 */
 
 #if defined(DLR_TRACE)
     debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql));
@@ -217,16 +219,22 @@
     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",
+    if (dst) 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);
+    else sql = octstr_format("SELECT %S, %S, %S, %S, %S, %S FROM %S WHERE %S=:1 AND %S=:2 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);
 
-    gwlist_append(binds, (Octstr *)smsc);      /* :1 */
-    gwlist_append(binds, (Octstr *)ts);        /* :2 */
-    gwlist_append(binds, (Octstr *)dst);       /* :3 */
+    gwlist_append(binds, (Octstr *)smsc);               /* :1 */
+    gwlist_append(binds, (Octstr *)ts);                 /* :2 */
+    if (dst) gwlist_append(binds, (Octstr *)dst);       /* :3 */
 
 #if defined(DLR_TRACE)
     debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql));
@@ -276,15 +284,18 @@
     if (pconn == NULL)
         return;
 
-    sql = octstr_format("UPDATE %S SET %S=:1 WHERE %S=:2 AND %S=:3 AND %S=:4 AND ROWNUM < 2",
+    if (dst) sql = octstr_format("UPDATE %S SET %S=:1 WHERE %S=:2 AND %S=:3 AND %S=:4 AND ROWNUM < 2",
                         fields->table, fields->field_status,
                         fields->field_smsc, fields->field_ts, fields->field_dst);
+    else sql = octstr_format("UPDATE %S SET %S=:1 WHERE %S=:2 AND %S=:3 AND ROWNUM < 2",
+                        fields->table, fields->field_status,
+                        fields->field_smsc, fields->field_ts);
 
     os_status = octstr_format("%d", status);
-    gwlist_append(binds, (Octstr *)os_status); /* :1 */
-    gwlist_append(binds, (Octstr *)smsc);      /* :2 */
-    gwlist_append(binds, (Octstr *)ts);        /* :3 */
-    gwlist_append(binds, (Octstr *)dst);       /* :4 */
+    gwlist_append(binds, (Octstr *)os_status);          /* :1 */
+    gwlist_append(binds, (Octstr *)smsc);               /* :2 */
+    gwlist_append(binds, (Octstr *)ts);                 /* :3 */
+    if (dst) gwlist_append(binds, (Octstr *)dst);       /* :4 */
 #if defined(DLR_TRACE)
     debug("dlr.oracle", 0, "sql: %s", octstr_get_cstr(sql));
 #endif
Index: gw/dlr_pgsql.c
===================================================================
--- gw/dlr_pgsql.c	(revision 4833)
+++ gw/dlr_pgsql.c	(working copy)
@@ -168,11 +168,18 @@
     Octstr *sql;
     List *result, *row;
 
-    sql = octstr_format("SELECT \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\" FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1;",
+    if (dst) sql = octstr_format("SELECT \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\" FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' AND \"%s\"='%s' LIMIT 1;",
                         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),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
+    else sql = octstr_format("SELECT \"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\" FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1;",
+                        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));
 
 
@@ -221,9 +228,14 @@
     Octstr *sql;
 
     debug("dlr.pgsql", 0, "removing DLR from database");
-    sql = octstr_format("DELETE FROM \"%s\" WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
+    if (dst) sql = octstr_format("DELETE FROM \"%s\" WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%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),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
+    else 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));
 
 
@@ -238,11 +250,18 @@
     Octstr *sql;
 
     debug("dlr.pgsql", 0, "updating DLR status in database");
-    sql = octstr_format("UPDATE \"%s\" SET \"%s\"=%d WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
+    if (dst) sql = octstr_format("UPDATE \"%s\" SET \"%s\"=%d WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
                         octstr_get_cstr(fields->table),
                         octstr_get_cstr(fields->field_status), status,
                         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),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
+    else sql = octstr_format("UPDATE \"%s\" SET \"%s\"=%d WHERE oid = (SELECT oid FROM \"%s\" WHERE \"%s\"='%s' AND \"%s\"='%s' LIMIT 1);",
+                        octstr_get_cstr(fields->table),
+                        octstr_get_cstr(fields->field_status), status,
+                        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));
     if (!pgsql_update(sql))
        warning(0, "DLR: PGSQL: No dlr updated for DST<%s> (status: %d)", octstr_get_cstr(dst), status);
Index: gw/dlr_sdb.c
===================================================================
--- gw/dlr_sdb.c	(revision 4833)
+++ gw/dlr_sdb.c	(working copy)
@@ -218,12 +218,21 @@
 
     gw_assert(res != NULL);
 
-    sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %s='%s' %s",
+    if (dst) sql = octstr_format("SELECT %s, %s, %s, %s, %s, %s FROM %s WHERE %s='%s' AND %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),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+                        sdb_get_limit_str());
+    else 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());
 
 #if defined(DLR_TRACE)
@@ -256,10 +265,19 @@
     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",
+
+    if (dst) sql = octstr_format("UPDATE %s SET %s=%d WHERE %s='%s' AND "
+       "%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),
+                        octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+                        sdb_get_limit_str());
+    else 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());
 
 #if defined(DLR_TRACE)
@@ -288,16 +306,31 @@
          * 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 = \
+        if (dst) sql = octstr_format("DELETE FROM %s WHERE oid = \
+                            (SELECT oid FROM %s WHERE %s='%s' AND %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),
+                            octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst));
+       else 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));
     } else {
-        sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %s='%s' %s",
+        if (dst) sql = octstr_format("DELETE FROM %s WHERE %s='%s' AND %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),
+                            octstr_get_cstr(fields->field_dst), octstr_get_cstr(dst),
+                            sdb_get_limit_str());
+       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());
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.