diff options
author | Paul J Stevens <paul@nfg.nl> | 2010-08-11 11:55:22 +0200 |
---|---|---|
committer | Paul J Stevens <paul@nfg.nl> | 2010-08-11 11:56:55 +0200 |
commit | aa879a69f2fd89500a0a97fb1c25efa66c0c50ca (patch) | |
tree | 788a1bf3d75c933baa80539e16bae93ae66ef218 | |
parent | e35474549dd657e1c6b5cb9ec440bae3dc457100 (diff) |
backout tree-pivot
-rw-r--r-- | src/dbmail-mailbox.c | 37 | ||||
-rw-r--r-- | src/dm_misc.c | 16 | ||||
-rw-r--r-- | src/dm_misc.h | 2 | ||||
-rw-r--r-- | test/check_dbmail_deliver.c | 10 |
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); |