summaryrefslogtreecommitdiffstats
path: root/src/context.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2003-08-26 21:43:31 +0000
committerLennart Poettering <lennart@poettering.net>2003-08-26 21:43:31 +0000
commit3bc3ad24a2c089b4ee80fc1765fab3d2af378d00 (patch)
tree632a002b1c9a507ab49c11875eb373a6642902fb /src/context.c
parentd4a8a10792c7f9b777487b2d15ab56c737e7e35c (diff)
Initial commit
git-svn-id: file:///home/lennart/svn/public/syrep/trunk@2 07ea20a6-d2c5-0310-9e02-9ef735347d72
Diffstat (limited to 'src/context.c')
-rw-r--r--src/context.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/src/context.c b/src/context.c
new file mode 100644
index 0000000..00455ea
--- /dev/null
+++ b/src/context.c
@@ -0,0 +1,199 @@
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <time.h>
+#include <limits.h>
+#include <sys/stat.h>
+#include <errno.h>
+#include <unistd.h>
+
+#include "context.h"
+#include "package.h"
+
+int db_context_free(struct syrep_db_context* c) {
+ if (c) {
+
+ if (c->db_id_meta)
+ c->db_id_meta->close(c->db_id_meta, 0);
+
+ if (c->db_md_name)
+ c->db_md_name->close(c->db_md_name, 0);
+
+ if (c->db_name_md)
+ c->db_name_md->close(c->db_name_md, 0);
+
+ if (c->db_md_lastname)
+ c->db_md_lastname->close(c->db_md_lastname, 0);
+
+ if (c->db_name_lastmd)
+ c->db_name_lastmd->close(c->db_name_lastmd, 0);
+
+ if (c->db_version_timestamp)
+ c->db_version_timestamp->close(c->db_version_timestamp, 0);
+
+ if (c->package)
+ package_remove(c->package);
+
+ if (c->origin)
+ free(c->origin);
+
+ free(c);
+ }
+
+ return 0;
+}
+
+
+static DB* open_db(const char*path, int dup) {
+ int ret;
+ DB* db;
+
+ if ((ret = db_create(&db, NULL, 0))) {
+ fprintf(stderr, "db_create: %s\n", db_strerror(ret));
+ return NULL;
+ }
+
+ if (dup)
+ db->set_flags(db, DB_DUPSORT);
+
+ //db->set_pagesize(db, 4096*8);
+
+ if ((ret = db->open(db, NULL, path, NULL, DB_BTREE, DB_CREATE, 0664))) {
+ db->err(db, ret, "open(%s)", path);
+ db->close(db, 0);
+ return NULL;
+ }
+
+ return db;
+}
+
+struct syrep_db_context* db_context_open(const char *filename) {
+ struct syrep_db_context *c = NULL;
+ const char* path;
+ FILE *f;
+
+ if (!(c = malloc(sizeof(struct syrep_db_context))))
+ goto fail;
+
+ memset(c, 0, sizeof(struct syrep_db_context));
+
+ if (!(c->package = package_open(filename)))
+ goto fail;
+
+ path = package_get_item(c->package, "timestamp");
+ if ((f = fopen(path, "r"))) {
+ if (fscanf(f, "%i", &c->timestamp) != 1)
+ c->timestamp = 0;
+ fclose(f);
+ }
+
+ if (!c->timestamp)
+ c->timestamp = time(NULL);
+
+ path = package_get_item(c->package, "version");
+ if ((f = fopen(path, "r"))) {
+ if (fscanf(f, "%u", &c->version) != 1)
+ c->version = 0;
+ fclose(f);
+ }
+
+ path = package_get_item(c->package, "origin");
+ if ((f = fopen(path, "r"))) {
+ char hn[256];
+ if (fgets(hn, sizeof(hn), f)) {
+ char *nl;
+
+ if ((nl = strchr(hn, '\n')))
+ *nl = 0;
+
+ if (hn[0])
+ c->origin = strdup(hn);
+ }
+
+ fclose(f);
+ } else
+ c->version = 0;
+
+ if (!c->origin) {
+ char hn[256];
+ if (gethostname(hn, sizeof(hn)) < 0)
+ goto fail;
+
+ c->origin = strdup(hn);
+ }
+
+ /* Creating database id_meta */
+ if (!(c->db_id_meta = open_db(package_get_item(c->package, "id_meta"), 0)))
+ goto fail;
+
+ /* Creating database md_name */
+ if (!(c->db_md_name = open_db(package_get_item(c->package, "md_name"), 1)))
+ goto fail;
+
+ /* Creating database name_md */
+ if (!(c->db_name_md = open_db(package_get_item(c->package, "name_md"), 1)))
+ goto fail;
+
+ /* Creating database name_lastmd */
+ if (!(c->db_name_lastmd = open_db(package_get_item(c->package, "name_lastmd"), 0)))
+ goto fail;
+
+ /* Creating database md_lastname */
+ if (!(c->db_md_lastname = open_db(package_get_item(c->package, "md_lastname"), 0)))
+ goto fail;
+
+ /* Creating database version_timestamp */
+ if (!(c->db_version_timestamp = open_db(package_get_item(c->package, "version_timestamp"), 0)))
+ goto fail;
+
+ return c;
+
+
+fail:
+ db_context_free(c);
+
+ return NULL;
+}
+
+int db_context_save(struct syrep_db_context *c, const char *filename) {
+ FILE *f;
+ assert(c && c->package && filename);
+
+ if (c->db_id_meta)
+ c->db_id_meta->sync(c->db_id_meta, 0);
+
+ if (c->db_md_name)
+ c->db_md_name->sync(c->db_md_name, 0);
+
+ if (c->db_name_md)
+ c->db_name_md->sync(c->db_name_md, 0);
+
+ if (c->db_md_lastname)
+ c->db_md_lastname->sync(c->db_md_lastname, 0);
+
+ if (c->db_name_lastmd)
+ c->db_name_lastmd->sync(c->db_name_lastmd, 0);
+
+ if (c->db_version_timestamp)
+ c->db_version_timestamp->sync(c->db_version_timestamp, 0);
+
+ if (!(f = fopen(package_get_item(c->package, "timestamp"), "w+")))
+ return -1;
+
+ fprintf(f, "%i\n", c->timestamp);
+ fclose(f);
+
+ if (!(f = fopen(package_get_item(c->package, "version"), "w+")))
+ return -1;
+
+ fprintf(f, "%u\n", c->version);
+ fclose(f);
+
+ if (!(f = fopen(package_get_item(c->package, "origin"), "w+")))
+ return -1;
+
+ fprintf(f, "%s\n", c->origin);
+ fclose(f);
+
+ return package_save(c->package, filename);
+}