diff options
-rw-r--r-- | camel/ChangeLog | 20 | ||||
-rw-r--r-- | camel/camel-block-file.c | 5 | ||||
-rw-r--r-- | camel/camel-index.c | 75 | ||||
-rw-r--r-- | camel/camel-index.h | 8 | ||||
-rw-r--r-- | camel/camel-text-index.c | 38 | ||||
-rw-r--r-- | camel/camel-text-index.h | 1 |
6 files changed, 123 insertions, 24 deletions
diff --git a/camel/ChangeLog b/camel/ChangeLog index 320eebc4c1..ac6d0eb5ea 100644 --- a/camel/ChangeLog +++ b/camel/ChangeLog @@ -1,3 +1,23 @@ +2002-09-24 Not Zed <NotZed@Ximian.com> + + * camel-text-index.c (text_index_compress_nosync): If we have no + data written to a key, dont add it, or its partition header. + +2002-09-23 Not Zed <NotZed@Ximian.com> + + * camel-block-file.c (sync_nolock): Mark root block dirty if we're + going to sync it. + (camel_key_file_finalise): de-count the active list if we close + it. + + * camel-text-index.c (text_index_delete): Implement. + (text_index_compress_nosync): Use index_delete when we're finished + with the old one, so it is properly deactivated. + + * camel-index.c (camel_index_delete): Remove api call. Mark index + deleted in new state variable. + (camel_index_*): Wrap all calls in check for deleted state. + 2002-09-23 Jeffrey Stedfast <fejj@ximian.com> * camel-folder.c (transfer_message_to): If the original message is diff --git a/camel/camel-block-file.c b/camel/camel-block-file.c index e61320b2ea..3ba97ba556 100644 --- a/camel/camel-block-file.c +++ b/camel/camel-block-file.c @@ -713,6 +713,7 @@ sync_nolock(CamelBlockFile *bs) d(printf("turning on sync flag\n")); bs->root->flags |= CAMEL_BLOCK_FILE_SYNC; + bs->root_block->flags |= CAMEL_BLOCK_DIRTY; return sync_block_nolock(bs, bs->root_block); } @@ -834,8 +835,10 @@ camel_key_file_finalise(CamelKeyFile *bs) e_dlist_remove((EDListNode *)p); UNLOCK(key_file_lock); - if (bs->fp) + if (bs-> fp) { + key_file_count--; fclose(bs->fp); + } g_free(bs->path); #ifdef ENABLE_THREADS diff --git a/camel/camel-index.c b/camel/camel-index.c index eb476b41fc..ea7a63fe08 100644 --- a/camel/camel-index.c +++ b/camel/camel-index.c @@ -116,7 +116,12 @@ camel_index_construct(CamelIndex *idx, const char *path, int flags) int camel_index_rename(CamelIndex *idx, const char *path) { - return CI_CLASS(idx)->rename(idx, path); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->rename(idx, path); + else { + errno = ENOENT; + return -1; + } } void @@ -129,43 +134,84 @@ camel_index_set_normalise(CamelIndex *idx, CamelIndexNorm func, void *data) int camel_index_sync(CamelIndex *idx) { - return CI_CLASS(idx)->sync(idx); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->sync(idx); + else { + errno = ENOENT; + return -1; + } } int camel_index_compress(CamelIndex *idx) { - return CI_CLASS(idx)->compress(idx); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->compress(idx); + else { + errno = ENOENT; + return -1; + } +} + +int +camel_index_delete(CamelIndex *idx) +{ + int ret; + + if ((idx->state & CAMEL_INDEX_DELETED) == 0) { + ret = CI_CLASS(idx)->delete(idx); + idx->state |= CAMEL_INDEX_DELETED; + } else { + errno = ENOENT; + ret = -1; + } + + return ret; } int camel_index_has_name(CamelIndex *idx, const char *name) { - return CI_CLASS(idx)->has_name(idx, name); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->has_name(idx, name); + else + return FALSE; } CamelIndexName * camel_index_add_name(CamelIndex *idx, const char *name) { - return CI_CLASS(idx)->add_name(idx, name); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->add_name(idx, name); + else + return NULL; } int camel_index_write_name(CamelIndex *idx, CamelIndexName *idn) { - return CI_CLASS(idx)->write_name(idx, idn); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->write_name(idx, idn); + else { + errno = ENOENT; + return -1; + } } CamelIndexCursor * camel_index_find_name(CamelIndex *idx, const char *name) { - return CI_CLASS(idx)->find_name(idx, name); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->find_name(idx, name); + else + return NULL; } void camel_index_delete_name(CamelIndex *idx, const char *name) { - return CI_CLASS(idx)->delete_name(idx, name); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + CI_CLASS(idx)->delete_name(idx, name); } CamelIndexCursor * @@ -174,6 +220,9 @@ camel_index_find(CamelIndex *idx, const char *word) char *b = (char *)word; CamelIndexCursor *ret; + if ((idx->state & CAMEL_INDEX_DELETED) != 0) + return NULL; + if (idx->normalise) b = idx->normalise(idx, word, idx->normalise_data); @@ -188,13 +237,19 @@ camel_index_find(CamelIndex *idx, const char *word) CamelIndexCursor * camel_index_words(CamelIndex *idx) { - return CI_CLASS(idx)->words(idx); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->words(idx); + else + return NULL; } CamelIndexCursor * camel_index_names(CamelIndex *idx) { - return CI_CLASS(idx)->names(idx); + if ((idx->state & CAMEL_INDEX_DELETED) == 0) + return CI_CLASS(idx)->names(idx); + else + return NULL; } /* ********************************************************************** */ diff --git a/camel/camel-index.h b/camel/camel-index.h index 81b84c3d38..0382dc1d0d 100644 --- a/camel/camel-index.h +++ b/camel/camel-index.h @@ -110,7 +110,8 @@ struct _CamelIndex { char *path; guint32 version; - guint32 flags; + guint32 flags; /* open flags */ + guint32 state; CamelIndexNorm normalise; void *normalise_data; @@ -121,6 +122,7 @@ struct _CamelIndexClass { int (*sync)(CamelIndex *idx); int (*compress)(CamelIndex *idx); + int (*delete)(CamelIndex *idx); int (*rename)(CamelIndex *idx, const char *path); @@ -135,6 +137,9 @@ struct _CamelIndexClass { CamelIndexCursor * (*names)(CamelIndex *idx); }; +/* flags, stored in 'state', set with set_state */ +#define CAMEL_INDEX_DELETED (1<<0) + CamelType camel_index_get_type (void); CamelIndex *camel_index_new(const char *path, int flags); @@ -145,6 +150,7 @@ void camel_index_set_normalise(CamelIndex *idx, CamelIndexNorm fun int camel_index_sync(CamelIndex *idx); int camel_index_compress(CamelIndex *idx); +int camel_index_delete(CamelIndex *idx); int camel_index_has_name(CamelIndex *idx, const char *name); CamelIndexName *camel_index_add_name(CamelIndex *idx, const char *name); diff --git a/camel/camel-text-index.c b/camel/camel-text-index.c index 3c490804fc..e340511131 100644 --- a/camel/camel-text-index.c +++ b/camel/camel-text-index.c @@ -263,6 +263,8 @@ text_index_sync(CamelIndex *idx) struct _CamelTextIndexRoot *rb; int ret = 0, wfrag, nfrag, work = FALSE; + d(printf("sync: blocks = %p\n", p->blocks)); + if (p->blocks == NULL) return 0; @@ -304,11 +306,12 @@ text_index_sync(CamelIndex *idx) ret = -1; /* only do the frag/compress check if we did some new writes on this index */ - if (ret == 0 && work) { - wfrag = rb->words ? (((rb->keys - rb->words) * 100)/ rb->words) : 0; - nfrag = rb->names ? ((rb->deleted * 100) / rb->names) : 0; - d(printf("wfrag = %d, nfrag = %d\n", wfrag, nfrag)); - d(printf(" words = %d, keys = %d\n", rb->words, rb->keys)); + wfrag = rb->words ? (((rb->keys - rb->words) * 100)/ rb->words) : 0; + nfrag = rb->names ? ((rb->deleted * 100) / rb->names) : 0; + d(printf("wfrag = %d, nfrag = %d, work = %s, ret = %d\n", wfrag, nfrag, work?"true":"false", ret)); + d(printf(" words = %d, keys = %d\n", rb->words, rb->keys)); + + if (ret == 0) { if (wfrag > 30 || nfrag > 20) ret = text_index_compress_nosync(idx); } @@ -466,11 +469,13 @@ text_index_compress_nosync(CamelIndex *idx) if (camel_key_file_write(newp->links, &newdata, newcount, newrecords) == -1) goto fail; } - - newkeyid = camel_key_table_add(newp->word_index, name, newdata, flags); - if (newkeyid == 0) - goto fail; - camel_partition_table_add(newp->word_hash, name, newkeyid); + + if (newdata != 0) { + newkeyid = camel_key_table_add(newp->word_index, name, newdata, flags); + if (newkeyid == 0) + goto fail; + camel_partition_table_add(newp->word_hash, name, newkeyid); + } g_free(name); name = NULL; } @@ -505,13 +510,13 @@ text_index_compress_nosync(CamelIndex *idx) fail: CAMEL_TEXT_INDEX_UNLOCK(idx, lock); + camel_index_delete((CamelIndex *)newidx); + camel_object_unref((CamelObject *)newidx); g_free(name); g_hash_table_destroy(remap); /* clean up temp files always */ - camel_text_index_remove(newpath); - sprintf(savepath, "%s~.index", oldpath); unlink(savepath); sprintf(newpath, "%s.data", savepath); @@ -521,6 +526,12 @@ fail: } static int +text_index_delete(CamelIndex *idx) +{ + return camel_text_index_remove(idx->path); +} + +static int text_index_rename(CamelIndex *idx, const char *path) { struct _CamelTextIndexPrivate *p = CTI_PRIVATE(idx); @@ -649,6 +660,8 @@ text_index_delete_name(CamelIndex *idx, const char *name) camel_key_t keyid; struct _CamelTextIndexRoot *rb = (struct _CamelTextIndexRoot *)p->blocks->root; + d(printf("Delete name: %s\n", name)); + /* probably doesn't really need locking, but oh well */ CAMEL_TEXT_INDEX_LOCK(idx, lock); @@ -714,6 +727,7 @@ camel_text_index_class_init(CamelTextIndexClass *klass) iklass->sync = text_index_sync; iklass->compress = text_index_compress; + iklass->delete = text_index_delete; iklass->rename = text_index_rename; diff --git a/camel/camel-text-index.h b/camel/camel-text-index.h index 09b8fc0db7..fd9e6aa116 100644 --- a/camel/camel-text-index.h +++ b/camel/camel-text-index.h @@ -1,3 +1,4 @@ + /* * Copyright (C) 2001 Ximian Inc. * |