Hi,
IMO we don't need to handle no destination case in DLR lookup but maybe it's
not a wrong idea to be able to ignore destination for some
reasons when SMSC send some junk to us.
ok here is the review for your patch:
+ if (dst){
+ int len = octstr_len(dst);
+ char *p = octstr_get_cstr(dst);
+ if (len > MIN_DST_LEN)
+ p += len - MIN_DST_LEN; /* get last MIN_DST_LEN digits */
+ like = octstr_create(strcat("%", p));
+ gwlist_append(binds, like);
+ }
why is this in every dlr implementation? we have abstraction for this, see dlr.c
- 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` LIKE ? 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);
...
First of all: like ? doesn't work as you expect... it should be something like:
LIKE CONCAT('%%', ?) and
this is too much maintenance for SQL that defined two times, how about like
this:
if (dst)
like = octstr_format('LIKE CONCAT('%%', ?)' ...);
else
like = octstr_create("");
sql = ...(".... %S", like)
The same is for DELETE, UPDATE...
+ if (like) octstr_destroy(like);
octstr_destroy will check for NULL for you...
+ if (octstr_compare(dlr->smsc, smsc) == 0 && octstr_compare(dlr->
+ timestamp, ts) == 0 && memcmp(p1 + len1 - size, p2 + len2 - size,
+ size) == 0)
+ return 0;
memcmp??? why not just use truncated destination and do: octstr_search???
+Msg *dlr_find(const Octstr *smsc, const Octstr *ts, const Octstr *dst, int
typ, int use_dst)
you don't need to change function. Just use dst = NULL and check it.
Thanks,
Alexander Malysh
Am 26.06.2010 um 10:23 schrieb Nikos Balkanas:
> Hi,
>
> I believe I have accounted for almost all your comments to produce the final
> working patch. I have no way of testing, other than compilation.
>
> This patch will povide:
>
> 1) Align dlr_oracle.c with the rest. Currently, Oracle does a full dst
> find/remove/update on each DLR.
> 2) Dst use on find/remove/update is controlled in dlr_find by a single
> variable, use_dst. This is currently set only at driver level and only in the
> emi driver, while everyone else has it false. However, very easily, if need
> arises, it can be set in smsc configuration.
> 3) All DLR handling for all smscs will remain as it used to be till now. Only
> emi handling changes, hopefully for the better (that is the purpose of the
> patch :-)).
> 4) It will try to match the last 7 digits of the destination or the length of
> the destination if it smaller. This is defined in gw/dlr_p.h as MIN_DST_LEN.
> Didn't want to make it larger, wanted to avoid prefix territory at all costs,
> since I have seen a lot of mangling there by the SMScs. Besides, I believe
> that 7 digits give enough resolution
> 5) People using emi, should rebuild their indeces, especially if they are
> running large batch jobs through EMI. The LIKE % construction is not very
> efficient.
>
> Enjoy,
> Nikos
> <kannel.diff>