summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul J Stevens <paul@nfg.nl>2010-08-11 11:55:22 +0200
committerPaul J Stevens <paul@nfg.nl>2010-08-11 11:56:55 +0200
commitaa879a69f2fd89500a0a97fb1c25efa66c0c50ca (patch)
tree788a1bf3d75c933baa80539e16bae93ae66ef218
parente35474549dd657e1c6b5cb9ec440bae3dc457100 (diff)
backout tree-pivot
-rw-r--r--src/dbmail-mailbox.c37
-rw-r--r--src/dm_misc.c16
-rw-r--r--src/dm_misc.h2
-rw-r--r--test/check_dbmail_deliver.c10
4 files changed, 21 insertions, 44 deletions
diff --git a/src/dbmail-mailbox.c b/src/dbmail-mailbox.c
index f1964338..0eb5ff12 100644
--- a/src/dbmail-mailbox.c
+++ b/src/dbmail-mailbox.c
@@ -307,10 +307,7 @@ char * dbmail_mailbox_orderedsubject(DbmailMailbox *self)
while (db_result_next(r)) {
i++;
idnr = db_result_get_u64(r,0);
-
- if (g_tree_nnodes(self->found) == 0)
- continue;
- if ( ! g_tree_lookup(self->found,(gconstpointer)&idnr))
+ if (! g_tree_lookup(self->found,(gconstpointer)&idnr))
continue;
subj = (char *)db_result_get(r,1);
g_tree_insert(tree,g_strdup(subj), NULL);
@@ -348,9 +345,6 @@ char * dbmail_mailbox_orderedsubject(DbmailMailbox *self)
while (db_result_next(r)) {
i++;
idnr = db_result_get_u64(r,0);
-
- if (g_tree_nnodes(self->found) == 0)
- continue;
if (! (msn = g_tree_lookup(self->found, (gconstpointer)&idnr)))
continue;
subj = (char *)db_result_get(r,1);
@@ -1322,7 +1316,7 @@ struct filter_helper {
GTree *a;
};
-static int filter_range_cb(gpointer key, gpointer value, gpointer data)
+static int filter_range(gpointer key, gpointer value, gpointer data)
{
u64_t *k, *v;
struct filter_helper *d = (struct filter_helper *)data;
@@ -1344,7 +1338,7 @@ static int filter_range_cb(gpointer key, gpointer value, gpointer data)
return FALSE;
}
-static void filter_range(GTree *c, u64_t l, u64_t r, GTree *a, gboolean uid)
+static void find_range(GTree *c, u64_t l, u64_t r, GTree *a, gboolean uid)
{
struct filter_helper data;
@@ -1353,7 +1347,7 @@ static void filter_range(GTree *c, u64_t l, u64_t r, GTree *a, gboolean uid)
data.max = r;
data.a = a;
- g_tree_foreach(c, (GTraverseFunc)filter_range_cb, &data);
+ g_tree_foreach(c, (GTraverseFunc)filter_range, &data);
}
GTree * dbmail_mailbox_get_set(DbmailMailbox *self, const char *set, gboolean uid)
@@ -1362,7 +1356,8 @@ GTree * dbmail_mailbox_get_set(DbmailMailbox *self, const char *set, gboolean ui
GString *t;
GTree *uids;
char *rest;
- u64_t l, r, lo = 0, hi = 0, maxmsn = 0;
+ u64_t i, l, r, lo = 0, hi = 0, maxmsn = 0;
+ u64_t *k, *v, *w = NULL;
GTree *a, *b, *c;
gboolean error = FALSE;
@@ -1451,17 +1446,13 @@ GTree * dbmail_mailbox_get_set(DbmailMailbox *self, const char *set, gboolean ui
else
c = MailboxState_getMsn(self->mbstate);
- filter_range(c, min(l,r), max(l,r), a, uid);
+ find_range(c, min(l,r), max(l,r), a, uid);
- TRACE(TRACE_DEBUG,"a[%d]", g_tree_nnodes(a));
-
- if (g_tree_merge(&b,&a,IST_SUBSEARCH_OR)) {
+ if (g_tree_merge(b,a,IST_SUBSEARCH_OR)) {
error = TRUE;
TRACE(TRACE_ERR, "cannot compare null trees");
break;
}
-
- TRACE(TRACE_DEBUG,"b[%d]", g_tree_nnodes(b));
if (! g_list_next(sets)) break;
sets = g_list_next(sets);
@@ -1475,8 +1466,6 @@ GTree * dbmail_mailbox_get_set(DbmailMailbox *self, const char *set, gboolean ui
if (error) {
g_tree_destroy(b);
b = NULL;
- } else {
- TRACE(TRACE_DEBUG,"b[%d]", g_tree_nnodes(b));
}
return b;
@@ -1574,7 +1563,7 @@ static gboolean _merge_search(GNode *node, GTree *found)
case IST_SUBSEARCH_NOT:
g_tree_foreach(found, (GTraverseFunc)_found_tree_copy, s->found);
g_node_children_foreach(node, G_TRAVERSE_ALL, (GNodeForeachFunc)_merge_search, (gpointer) s->found);
- g_tree_merge(&found, &s->found, IST_SUBSEARCH_NOT);
+ g_tree_merge(found, s->found, IST_SUBSEARCH_NOT);
s->merged = TRUE;
g_tree_destroy(s->found);
s->found = NULL;
@@ -1597,17 +1586,17 @@ static gboolean _merge_search(GNode *node, GTree *found)
g_node_children_foreach(y, G_TRAVERSE_ALL, (GNodeForeachFunc)_merge_search, (gpointer)b->found);
}
- g_tree_merge(&a->found, &b->found,IST_SUBSEARCH_OR);
+ g_tree_merge(a->found, b->found,IST_SUBSEARCH_OR);
b->merged = TRUE;
g_tree_destroy(b->found);
b->found = NULL;
- g_tree_merge(&s->found, &a->found,IST_SUBSEARCH_OR);
+ g_tree_merge(s->found, a->found,IST_SUBSEARCH_OR);
a->merged = TRUE;
g_tree_destroy(a->found);
a->found = NULL;
- g_tree_merge(&found, &s->found, IST_SUBSEARCH_AND);
+ g_tree_merge(found, s->found, IST_SUBSEARCH_AND);
s->merged = TRUE;
g_tree_destroy(s->found);
s->found = NULL;
@@ -1615,7 +1604,7 @@ static gboolean _merge_search(GNode *node, GTree *found)
break;
default:
- g_tree_merge(&found, &s->found, IST_SUBSEARCH_AND);
+ g_tree_merge(found, s->found, IST_SUBSEARCH_AND);
s->merged = TRUE;
g_tree_destroy(s->found);
s->found = NULL;
diff --git a/src/dm_misc.c b/src/dm_misc.c
index b4dd4b7b..f3911606 100644
--- a/src/dm_misc.c
+++ b/src/dm_misc.c
@@ -991,15 +991,12 @@ static gboolean traverse_tree_merger(gpointer key, gpointer value UNUSED, tree_m
return FALSE;
}
-int g_tree_merge(GTree **left, GTree **right, int condition)
+int g_tree_merge(GTree *a, GTree *b, int condition)
{
char *type = NULL;
GList *keys = NULL;
GTree *c = NULL;
int alen = 0, blen=0, klen=0;
- GTree *a, *b;
- a = *left;
- b = *right;
gpointer key;
gpointer value;
@@ -1014,11 +1011,6 @@ int g_tree_merge(GTree **left, GTree **right, int condition)
switch(condition) {
case IST_SUBSEARCH_AND:
- if (! g_tree_nnodes(b) > 0) { //short-cut: pivot trees
- c = a; *left = *right; *right = c;
- a = *left; b = *right;
- }
-
if (! g_tree_nnodes(a) > 0)
break;
@@ -1044,11 +1036,6 @@ int g_tree_merge(GTree **left, GTree **right, int condition)
case IST_SUBSEARCH_OR:
type=g_strdup("OR");
- if (! g_tree_nnodes(a) > 0) { //short-cut: pivot trees
- c = a; *left = *right; *right = c;
- a = *left; b = *right;
- }
-
if (! g_tree_nnodes(b) > 0)
break;
@@ -1112,6 +1099,7 @@ int g_tree_merge(GTree **left, GTree **right, int condition)
merger->list = g_list_first(merger->list);
g_list_free(merger->list);
+
g_free(merger);
g_free(type);
diff --git a/src/dm_misc.h b/src/dm_misc.h
index 6395ab19..4076faad 100644
--- a/src/dm_misc.h
+++ b/src/dm_misc.h
@@ -111,7 +111,7 @@ gint dm_strcasecmpdata(gconstpointer a, gconstpointer b, gpointer data);
GList * g_tree_keys(GTree *tree);
GList * g_tree_values(GTree *tree);
void tree_dump(GTree *t);
-int g_tree_merge(GTree **a, GTree **b, int condition);
+int g_tree_merge(GTree *a, GTree *b, int condition);
void pack_char(char *in, char c);
diff --git a/test/check_dbmail_deliver.c b/test/check_dbmail_deliver.c
index 99bc5981..2876913e 100644
--- a/test/check_dbmail_deliver.c
+++ b/test/check_dbmail_deliver.c
@@ -784,7 +784,7 @@ START_TEST(test_g_tree_merge_not)
tree_add_key(b, r);
}
- g_tree_merge(&a,&b,IST_SUBSEARCH_NOT);
+ g_tree_merge(a,b,IST_SUBSEARCH_NOT);
fail_unless(g_tree_nnodes(a)==5002,"g_tree_merge failed. Too few nodes in a. [%ld]", g_tree_nnodes(a));
g_tree_destroy(a);
@@ -797,7 +797,7 @@ START_TEST(test_g_tree_merge_not)
for (r=90000; r<=100000; r+=2)
tree_add_key(a, r);
- g_tree_merge(&a,&b,IST_SUBSEARCH_NOT);
+ g_tree_merge(a,b,IST_SUBSEARCH_NOT);
fail_unless(g_tree_nnodes(a)==5002,"g_tree_merge failed. Too few nodes in a. [%ld]", g_tree_nnodes(a));
g_tree_destroy(a);
@@ -818,7 +818,7 @@ START_TEST(test_g_tree_merge_or)
for (r=10000; r<=100000; r+=2)
tree_add_key(b, r);
- g_tree_merge(&a,&b,IST_SUBSEARCH_OR);
+ g_tree_merge(a,b,IST_SUBSEARCH_OR);
fail_unless(g_tree_nnodes(a)==45002,"g_tree_merge failed. Too many nodes in a. [%ld]", g_tree_nnodes(a));
g_tree_destroy(a);
@@ -845,7 +845,7 @@ START_TEST(test_g_tree_merge_and)
tree_add_key(b, r);
}
- g_tree_merge(&a,&b,IST_SUBSEARCH_AND);
+ g_tree_merge(a,b,IST_SUBSEARCH_AND);
fail_unless(g_tree_nnodes(a)==9001,"g_tree_merge failed. Too few nodes in a.[%ld]", g_tree_nnodes(a));
g_tree_destroy(a);
@@ -862,7 +862,7 @@ START_TEST(test_g_tree_merge_and)
for (r=10000; r<100000; r++)
tree_add_key(b, r);
- g_tree_merge(&a,&b,IST_SUBSEARCH_AND);
+ g_tree_merge(a,b,IST_SUBSEARCH_AND);
fail_unless(g_tree_nnodes(a)==45001,"g_tree_merge failed. Too few nodes in a. [%ld]", g_tree_nnodes(a));
g_tree_destroy(a);