diff options
author | Lennart Poettering <lennart@poettering.net> | 2003-08-26 21:43:31 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2003-08-26 21:43:31 +0000 |
commit | 3bc3ad24a2c089b4ee80fc1765fab3d2af378d00 (patch) | |
tree | 632a002b1c9a507ab49c11875eb373a6642902fb /src/context.c | |
parent | d4a8a10792c7f9b777487b2d15ab56c737e7e35c (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.c | 199 |
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); +} |