Hi all,

I'm looking to optimize _ic_search without resorting to drastics.

I noticed dbmsgbuf.c retrieves the full message from the database in two functions. In both cases first the physmessage_id is queried using the msgid, followed by a query on the messageblks table using the physmessage_id. Two queries where one suffices. A simple but effective improvement I think. Query syntax (left join ... using ...) checked on mysql/postgres (dunno about oracle or ansi-sql).

I also fixed some of the FIXME's ...

Ilja?

PS. Of course searching still sucks major :-( until we get some real header caching...


--
  ________________________________________________________________
  Paul Stevens                                  mailto:[EMAIL PROTECTED]
  NET FACILITIES GROUP                     PGP: finger [EMAIL PROTECTED]
  The Netherlands________________________________http://www.nfg.nl
#! /bin/sh -e
## 02_dbmsgbuf.dpatch by  <[EMAIL PROTECTED]>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: No description.

if [ $# -lt 1 ]; then
    echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
    exit 1
fi

[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
patch_opts="${patch_opts:--f --no-backup-if-mismatch} ${2:+-d $2}"

case "$1" in
    -patch) patch -p1 ${patch_opts} < $0;;
    -unpatch) patch -R -p1 ${patch_opts} < $0;;
    *)
        echo "`basename $0`: script expects -patch|-unpatch as argument" >&2
        exit 1;;
esac

exit 0

@DPATCH@
diff -urNad /usr/src/dbmail2/dbmail-2.0/dbmsgbuf.c dbmail-2.0/dbmsgbuf.c
--- /usr/src/dbmail2/dbmail-2.0/dbmsgbuf.c      2004-06-09 00:19:30.000000000 
+0200
+++ dbmail-2.0/dbmsgbuf.c       2004-06-09 00:25:13.000000000 +0200
@@ -51,17 +51,10 @@
 static db_pos_t zeropos; /**< absolute position (block/offset) of 
                            msgbuf_buf[0]*/
 static unsigned nblocks = 0; /**< number of block  */
+static const char * tmprow;
 
 int db_init_msgfetch(u64_t msg_idnr) 
 {
-       u64_t physmessage_id;
-
-       if (db_get_physmessage_id(msg_idnr, &physmessage_id) == -1) {
-               trace(TRACE_ERROR, "%s,%s: error getting physmessage_id",
-                     __FILE__, __func__);
-               return -1;
-       }
-       
        msgbuf_buf = (char *) my_malloc(sizeof(char) * (size_t) 
MSGBUF_WINDOWSIZE);
        if (!msgbuf_buf) {
                return -1;
@@ -70,11 +63,13 @@
        if (_msg_fetch_inited != 0)
                return 0;
        memset(msgbuf_buf, '\0', (size_t) MSGBUF_WINDOWSIZE);
-
+       
        snprintf(query, DEF_QUERYSIZE,
-                "SELECT messageblk FROM messageblks "
-                "WHERE physmessage_id = '%llu' ORDER BY messageblk_idnr",
-                physmessage_id);
+               "SELECT messageblk FROM messageblks lEFT JOIN messages "
+               "USING (physmessage_id) "
+               "WHERE messages.message_idnr = '%llu' "
+               "ORDER BY messageblk_idnr",
+               msg_idnr);
 
        if (db_query(query) == -1) {
                trace(TRACE_ERROR, "%s,%s: could not get message",
@@ -99,9 +94,14 @@
        _msgrow_idx = 0;
 
        /* FIXME: this will explode is db_get_result returns NULL. */
-       rowlength = db_get_length(_msgrow_idx, 0);
-       strncpy(msgbuf_buf, db_get_result(_msgrow_idx, 0),
-               (size_t) MSGBUF_WINDOWSIZE - 1);
+       tmprow = db_get_result(_msgrow_idx, 0);
+       rowlength = (u64_t)strlen(tmprow);
+       
+       if (! strncpy(msgbuf_buf,tmprow, MSGBUF_WINDOWSIZE - 1)) {
+               db_free_result();
+               free(msgbuf_buf);
+               return -1;
+       }
 
        zeropos.block = 0;
        zeropos.pos = 0;
@@ -123,10 +123,11 @@
        }
 
        /* FIXME: this will explode is db_get_result returns NULL. */
-       rowlength = db_get_length(_msgrow_idx, 0);
        rowpos = 0;
-       strncpy(&msgbuf_buf[msgbuf_buflen], db_get_result(_msgrow_idx, 0),
-               MSGBUF_WINDOWSIZE - msgbuf_buflen - 1);
+       tmprow = db_get_result(_msgrow_idx, 0);
+       rowlength = (u64_t)strlen(tmprow);
+       
+       strncpy(&msgbuf_buf[msgbuf_buflen], tmprow, MSGBUF_WINDOWSIZE - 
msgbuf_buflen - 1);
 
        if (rowlength <= MSGBUF_WINDOWSIZE - msgbuf_buflen - 1) {
                /* 2nd block fits entirely */
@@ -144,6 +145,7 @@
        return 1;
 }
 
+       
 int db_update_msgbuf(int minlen)
 {
        /* use the former msgbuf_result */
@@ -324,19 +326,12 @@
 long db_dump_range(MEM * outmem, db_pos_t start,
                   db_pos_t end, u64_t msg_idnr)
 {
-       u64_t physmessage_id;
        u64_t i, startpos, endpos, j, bufcnt;
        u64_t outcnt;
        u64_t distance;
        char buf[DUMP_BUF_SIZE];
        const char *field;
 
-       if (db_get_physmessage_id(msg_idnr, &physmessage_id) == -1) {
-               trace(TRACE_ERROR, "%s,%s: error getting physmessage_id",
-                     __FILE__, __func__);
-               return -1;
-       }
-
        trace(TRACE_DEBUG,
              "%s,%s: Dumping range: (%llu,%llu) - (%llu,%llu)",
              __FILE__, __func__,
@@ -353,11 +348,13 @@
                      __FILE__, __func__);
                return -1;
        }
-
+       
        snprintf(query, DEF_QUERYSIZE,
-                "SELECT messageblk FROM messageblks "
-                "WHERE physmessage_id = '%llu' "
-                "ORDER BY messageblk_idnr", physmessage_id);
+               "SELECT messageblk FROM messageblks lEFT JOIN messages "
+               "USING (physmessage_id) "
+               "WHERE messages.message_idnr = '%llu' "
+               "ORDER BY messageblk_idnr",
+               msg_idnr);
 
        if (db_query(query) == -1) {
                trace(TRACE_ERROR, "%s,%s: could not get message",

Reply via email to