#include <sys/time.h>
#endif
#include "mutt.h"
+#include "hcache.h"
#ifdef USE_IMAP
#include "message.h"
#endif
return h;
}
+void *
+mutt_hcache_fetch(void *db, const char *filename,
+ size_t(*keylen) (const char *fn))
+{
+ struct header_cache *h = db;
+ void* data;
+
+ data = mutt_hcache_fetch_raw (db, filename, keylen);
+
+ if (!crc32_matches(data, h->crc))
+ {
+ FREE(&data);
+ return NULL;
+ }
+
+ return data;
+}
+
+void *
+mutt_hcache_fetch_raw (void *db, const char *filename,
+ size_t(*keylen) (const char *fn))
+{
+ struct header_cache *h = db;
+#ifndef HAVE_DB4
+ char path[_POSIX_PATH_MAX];
+ int ksize;
+#endif
+#ifdef HAVE_QDBM
+ char *data = NULL;
+#elif HAVE_GDBM
+ datum key;
+ datum data;
+#elif HAVE_DB4
+ DBT key;
+ DBT data;
+#endif
+
+ if (!h)
+ return NULL;
+
+#ifdef HAVE_DB4
+ 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);
+
+ return data.data;
+#else
+ strncpy(path, h->folder, sizeof (path));
+ safe_strcat(path, sizeof (path), filename);
+
+ ksize = strlen (h->folder) + keylen (path + strlen (h->folder));
+#endif
+#ifdef HAVE_QDBM
+ data = vlget(h->db, path, ksize, NULL);
+
+ return data;
+#elif HAVE_GDBM
+ key.dptr = path;
+ key.dsize = ksize;
+
+ data = gdbm_fetch(h->db, key);
+
+ return data.dptr;
+#endif
+}
+
+int
+mutt_hcache_store(void *db, const char *filename, HEADER * header,
+ unsigned long uid_validity,
+ size_t(*keylen) (const char *fn))
+{
+ struct header_cache *h = db;
+ char* data;
+ int dlen;
+ int ret;
+
+ if (!h)
+ return -1;
+
+ data = mutt_hcache_dump(db, header, &dlen, uid_validity);
+ ret = mutt_hcache_store_raw (db, filename, data, dlen, keylen);
+
+ FREE(&data);
+
+ return ret;
+}
+
+int
+mutt_hcache_store_raw (void* db, const char* filename, char* data,
+ size_t dlen, size_t(*keylen) (const char* fn))
+{
+ struct header_cache *h = db;
+#ifndef HAVE_DB4
+ char path[_POSIX_PATH_MAX];
+ int ksize;
+#endif
+#if HAVE_QDBM
+ int dsize;
+ char *data = NULL;
+#elif HAVE_GDBM
+ datum key;
+ datum databuf;
+#elif HAVE_DB4
+ DBT key;
+ DBT databuf;
+#endif
+
+ if (!h)
+ return -1;
+
+#if HAVE_DB4
+ filename++; /* skip '/' */
+
+ mutt_hcache_dbt_init(&key, (void *) filename, keylen(filename));
+
+ mutt_hcache_dbt_empty_init(&databuf);
+ databuf.flags = DB_DBT_USERMEM;
+ databuf.data = data;
+ databuf.size = dlen;
+ databuf.ulen = dlen;
+
+ return h->db->put(h->db, NULL, &key, &data, 0);
+#else
+ strncpy(path, h->folder, sizeof (path));
+ safe_strcat(path, sizeof (path), filename);
+
+ ksize = strlen(h->folder) + keylen(path + strlen(h->folder));
+#endif
+#if HAVE_QDBM
+ return vlput(h->db, path, ksize, data, dlen, VL_DOVER);
+#elif HAVE_GDBM
+ key.dptr = path;
+ key.dsize = ksize;
+
+ databuf.dsize = dlen;
+ databuf.dptr = data;
+
+ return gdbm_store(h->db, key, databuf, GDBM_REPLACE);
+#endif
+}
+
#if HAVE_QDBM
void *
mutt_hcache_open(const char *path, const char *folder)
FREE(&h);
}
-void *
-mutt_hcache_fetch(void *db, const char *filename,
- size_t(*keylen) (const char *fn))
-{
- struct header_cache *h = db;
- char path[_POSIX_PATH_MAX];
- int ksize;
- char *data = NULL;
-
- if (!h)
- return NULL;
-
- strncpy(path, h->folder, sizeof (path));
- safe_strcat(path, sizeof (path), filename);
-
- ksize = strlen(h->folder) + keylen(path + strlen(h->folder));
-
- data = vlget(h->db, path, ksize, NULL);
-
- if (! crc32_matches(data, h->crc))
- {
- FREE(&data);
- return NULL;
- }
-
- return data;
-}
-
-int
-mutt_hcache_store(void *db, const char *filename, HEADER * header,
- unsigned long uid_validity,
- size_t(*keylen) (const char *fn))
-{
- struct header_cache *h = db;
- char path[_POSIX_PATH_MAX];
- int ret;
- int ksize, dsize;
- char *data = NULL;
-
- if (!h)
- return -1;
-
- strncpy(path, h->folder, sizeof (path));
- safe_strcat(path, sizeof (path), filename);
-
- ksize = strlen(h->folder) + keylen(path + strlen(h->folder));
-
- data = mutt_hcache_dump(db, header, &dsize, uid_validity);
-
- ret = vlput(h->db, path, ksize, data, dsize, VL_DOVER);
-
- FREE(&data);
-
- return ret;
-}
-
int
mutt_hcache_delete(void *db, const char *filename,
size_t(*keylen) (const char *fn))
FREE(&h);
}
-void *
-mutt_hcache_fetch(void *db, const char *filename,
- size_t(*keylen) (const char *fn))
-{
- struct header_cache *h = db;
- datum key;
- datum data;
- char path[_POSIX_PATH_MAX];
-
- if (!h)
- return NULL;
-
- strncpy(path, h->folder, sizeof (path));
- safe_strcat(path, sizeof (path), filename);
-
- key.dptr = path;
- key.dsize = strlen(h->folder) + keylen(path + strlen(h->folder));
-
- data = gdbm_fetch(h->db, key);
-
- if (!crc32_matches(data.dptr, h->crc))
- {
- FREE(&data.dptr);
- return NULL;
- }
-
- return data.dptr;
-}
-
-int
-mutt_hcache_store(void *db, const char *filename, HEADER * header,
- unsigned long uid_validity,
- size_t(*keylen) (const char *fn))
-{
- struct header_cache *h = db;
- datum key;
- datum data;
- char path[_POSIX_PATH_MAX];
- int ret;
-
- if (!h)
- return -1;
-
- strncpy(path, h->folder, sizeof (path));
- safe_strcat(path, sizeof (path), filename);
-
- key.dptr = path;
- key.dsize = strlen(h->folder) + keylen(path + strlen(h->folder));
-
- data.dptr = mutt_hcache_dump(db, header, &data.dsize, uid_validity);
-
- ret = gdbm_store(h->db, key, data, GDBM_REPLACE);
-
- FREE(&data.dptr);
-
- return ret;
-}
-
int
mutt_hcache_delete(void *db, const char *filename,
size_t(*keylen) (const char *fn))
FREE(&h);
}
-void *
-mutt_hcache_fetch(void *db, const char *filename,
- size_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))
- {
- FREE(&data.data);
- return NULL;
- }
-
- return data.data;
-}
-
-int
-mutt_hcache_store(void *db, const char *filename, HEADER * header,
- unsigned long uid_validity,
- size_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);
-
- FREE(&data.data);
-
- return ret;
-}
-
int
mutt_hcache_delete(void *db, const char *filename,
size_t(*keylen) (const char *fn))
--- /dev/null
+/*
+ * Copyright (C) 2004 Thomas Glanzmann <sithglan@stud.uni-erlangen.de>
+ * Copyright (C) 2004 Tobias Werth <sitowert@stud.uni-erlangen.de>
+ * Copyright (C) 2004 Brian Fundakowski Feldman <green@FreeBSD.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#ifndef _HCACHE_H_
+#define _HCACHE_H_ 1
+
+void *mutt_hcache_open(const char *path, const char *folder);
+void mutt_hcache_close(void *db);
+HEADER *mutt_hcache_restore(const unsigned char *d, HEADER **oh);
+void *mutt_hcache_fetch(void *db, const char *filename, size_t (*keylen)(const char *fn));
+void *mutt_hcache_fetch_raw (void *db, const char *filename,
+ size_t (*keylen)(const char *fn));
+int mutt_hcache_store(void *db, const char *filename, HEADER *h,
+ unsigned long uid_validity, size_t (*keylen)(const char *fn));
+int mutt_hcache_store_raw (void* db, const char* filename, char* data,
+ size_t dlen, size_t(*keylen) (const char* fn));
+int mutt_hcache_delete(void *db, const char *filename, size_t (*keylen)(const char *fn));
+
+#endif /* _HCACHE_H_ */