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",