X-Git-Url: http://git.madism.org/?p=apps%2Fmadmutt.git;a=blobdiff_plain;f=lib-mx%2Fhcache.c;fp=lib-mx%2Fhcache.c;h=846a6cfdf1f093ce8b7957887efb978c5864ad0e;hp=4f4504c94772a7ed4f18e757f2da77291b4475f4;hb=262e2af383382c02b8a3dda72168f6505ddae15f;hpb=6b8e3f7a8d030a75121a72ba89ae8063439aaa6c diff --git a/lib-mx/hcache.c b/lib-mx/hcache.c index 4f4504c..846a6cf 100644 --- a/lib-mx/hcache.c +++ b/lib-mx/hcache.c @@ -21,8 +21,6 @@ #include #elif defined(HAVE_GDBM) #include -#elif defined(HAVE_DB4) -#include #endif #include @@ -41,12 +39,6 @@ struct header_cache { GDBM_FILE db; char *folder; unsigned int crc; -#elif defined(HAVE_DB4) - DB_ENV *env; - DB *db; - unsigned int crc; - int fd; - char lockfile[_POSIX_PATH_MAX]; #endif }; @@ -746,182 +738,6 @@ mutt_hcache_delete (void *db, const char *filename, return gdbm_delete (h->db, key); } -#elif defined(HAVE_DB4) - -static void mutt_hcache_dbt_init (DBT * dbt, void *data, ssize_t len) -{ - dbt->data = data; - dbt->size = dbt->ulen = len; - dbt->dlen = dbt->doff = 0; - dbt->flags = DB_DBT_USERMEM; -} - -static void mutt_hcache_dbt_empty_init (DBT * dbt) -{ - dbt->data = NULL; - dbt->size = dbt->ulen = dbt->dlen = dbt->doff = 0; - dbt->flags = 0; -} - -void *mutt_hcache_open (const char *path, const char *folder) -{ - struct stat sb; - u_int32_t createflags = DB_CREATE; - int ret; - struct header_cache *h = p_new(struct header_cache, 1); - int pagesize = atoi (HeaderCachePageSize); - - - h->crc = generate_crc32 (); - - if (!path || path[0] == '\0') { - p_delete(&h); - return NULL; - } - - path = mutt_hcache_per_folder (path, folder); - - snprintf (h->lockfile, _POSIX_PATH_MAX, "%s-lock-hack", path); - - h->fd = open (h->lockfile, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); - if (h->fd < 0) { - p_delete(&h); - return NULL; - } - - if (mx_lock_file (h->lockfile, h->fd, 1, 0, 5)) { - close (h->fd); - p_delete(&h); - return NULL; - } - - ret = db_env_create (&h->env, 0); - if (ret) { - mx_unlock_file (h->lockfile, h->fd, 0); - close (h->fd); - p_delete(&h); - return NULL; - } - - ret = - (h->env->open)(h->env, NULL, DB_INIT_MPOOL | DB_CREATE | DB_PRIVATE, 0600); - if (!ret) { - ret = db_create (&h->db, h->env, 0); - if (ret) { - h->env->close (h->env, 0); - mx_unlock_file (h->lockfile, h->fd, 0); - close (h->fd); - p_delete(&h); - return NULL; - } - } - - if (stat (path, &sb) != 0 && errno == ENOENT) { - createflags |= DB_EXCL; - h->db->set_pagesize (h->db, pagesize); - } - - ret = (h->db->open)(h->db, NULL, path, folder, DB_BTREE, createflags, 0600); - if (ret) { - h->db->close (h->db, 0); - h->env->close (h->env, 0); - mx_unlock_file (h->lockfile, h->fd, 0); - close (h->fd); - p_delete(&h); - return NULL; - } - - return h; -} - -void mutt_hcache_close (void *db) -{ - struct header_cache *h = db; - - if (!h) { - return; - } - - h->db->close (h->db, 0); - h->env->close (h->env, 0); - mx_unlock_file (h->lockfile, h->fd, 0); - close (h->fd); - p_delete(&h); -} - -void *mutt_hcache_fetch (void *db, const char *filename, - ssize_t (*keylen) (const char *fn)) -{ - DBT key; - DBT data; - struct header_cache *h = db; - - if (!h) { - return NULL; - } - - filename++; /* skip '/' */ - - mutt_hcache_dbt_init (&key, (void *) filename, keylen (filename)); - mutt_hcache_dbt_empty_init (&data); - data.flags = DB_DBT_MALLOC; - - h->db->get (h->db, NULL, &key, &data, 0); - - if (!crc32_matches (data.data, h->crc)) { - p_delete(&data.data); - return NULL; - } - - return data.data; -} - -int -mutt_hcache_store (void *db, const char *filename, HEADER * header, - unsigned long uid_validity, ssize_t (*keylen) (const char *fn)) -{ - DBT key; - DBT data; - int ret; - struct header_cache *h = db; - - if (!h) { - return -1; - } - - filename++; /* skip '/' */ - - mutt_hcache_dbt_init (&key, (void *) filename, keylen (filename)); - - mutt_hcache_dbt_empty_init (&data); - data.flags = DB_DBT_USERMEM; - data.data = - mutt_hcache_dump (db, header, (signed int *) &data.size, uid_validity); - data.ulen = data.size; - - ret = h->db->put (h->db, NULL, &key, &data, 0); - - p_delete(&data.data); - - return ret; -} - -int -mutt_hcache_delete (void *db, const char *filename, - ssize_t (*keylen) (const char *fn)) -{ - DBT key; - struct header_cache *h = db; - - if (!h) { - return -1; - } - - filename++; /* skip '/' */ - - mutt_hcache_dbt_init (&key, (void *) filename, keylen (filename)); - return h->db->del (h->db, NULL, &key, 0); -} #endif #endif /* USE_HCACHE */