[dovecot-cvs]
dovecot/src/lib-storage/index/dbox dbox-uidlist.c, 1.3, 1.4
cras at dovecot.org
cras at dovecot.org
Wed Dec 21 19:47:52 EET 2005
Update of /var/lib/cvs/dovecot/src/lib-storage/index/dbox
In directory talvi:/tmp/cvs-serv29608
Modified Files:
dbox-uidlist.c
Log Message:
Fixes
Index: dbox-uidlist.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/dbox/dbox-uidlist.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- dbox-uidlist.c 21 Dec 2005 17:25:35 -0000 1.3
+++ dbox-uidlist.c 21 Dec 2005 17:47:49 -0000 1.4
@@ -3,6 +3,7 @@
#include "lib.h"
#include "hex-dec.h"
#include "array.h"
+#include "bsearch-insert-pos.h"
#include "seq-range-array.h"
#include "str.h"
#include "istream.h"
@@ -14,6 +15,7 @@
#include <stddef.h>
#include <stdio.h>
+#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <utime.h>
@@ -153,7 +155,7 @@
static int dbox_uidlist_entry_cmp(const void *key, const void *p)
{
const unsigned int *file_seq = key;
- const struct dbox_uidlist_entry **entry = p;
+ struct dbox_uidlist_entry *const *entry = p;
return (int)file_seq - (int)(*entry)->file_seq;
}
@@ -179,7 +181,7 @@
/* merge to existing entry. they're written in order, so we
don't try to handle non-merging inserting. */
entries = array_get_modifyable(&uidlist->entries, &count);
- pos = bsearch(src_entry->file_seq, entries, count,
+ pos = bsearch(&src_entry->file_seq, entries, count,
sizeof(*entries), dbox_uidlist_entry_cmp);
if (pos == NULL) {
mail_storage_set_critical(
@@ -434,16 +436,16 @@
unsigned int *idx_r)
{
struct dbox_uidlist_entry *const *entries, **entry;
- unsigned int i, count;
+ unsigned int count;
entries = array_get(&uidlist->entries, &count);
- entry = bsearch(file_seq, entries, count, sizeof(*entries),
+ entry = bsearch(&file_seq, entries, count, sizeof(*entries),
dbox_uidlist_entry_cmp);
if (entry == NULL)
return NULL;
*idx_r = entry - entries;
- return entry;
+ return *entry;
}
struct dbox_uidlist_entry *
@@ -1061,6 +1063,10 @@
void dbox_uidlist_sync_rollback(struct dbox_uidlist_sync_ctx *ctx)
{
+ array_clear(&ctx->uidlist->entries);
+ ctx->uidlist->ino = 0;
+ ctx->uidlist->mtime = 0;
+
dbox_uidlist_unlock(ctx->uidlist);
i_free(ctx);
}
@@ -1073,7 +1079,9 @@
void dbox_uidlist_sync_append(struct dbox_uidlist_sync_ctx *ctx,
const struct dbox_uidlist_entry *entry)
{
+ struct dbox_uidlist_entry *const *entries, **pos;
struct dbox_uidlist_entry *new_entry;
+ unsigned int count;
new_entry = p_new(ctx->uidlist->entry_pool,
struct dbox_uidlist_entry, 1);
@@ -1083,7 +1091,16 @@
struct seq_range, array_count(&entry->uid_list) + 1);
array_append_array(&new_entry->uid_list, &entry->uid_list);
- array_append(&ctx->uidlist->entries, &new_entry, 1);
+ entries = array_get(&ctx->uidlist->entries, &count);
+ if (count == 0 || entries[count-1]->file_seq < new_entry->file_seq)
+ array_append(&ctx->uidlist->entries, &new_entry, 1);
+ else {
+ pos = bsearch_insert_pos(&new_entry->file_seq, entries,
+ count, sizeof(*entries),
+ dbox_uidlist_entry_cmp);
+ array_insert(&ctx->uidlist->entries, pos - entries,
+ &new_entry, 1);
+ }
}
int dbox_uidlist_sync_unlink(struct dbox_uidlist_sync_ctx *ctx,
More information about the dovecot-cvs
mailing list