#include #include #include #include #include #include #include #include #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", 1); 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", 1); if ((f = fopen(path, "r"))) { if (fscanf(f, "%u", &c->version) != 1) c->version = 0; fclose(f); } path = package_get_item(c->package, "origin", 1); 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", 1), 0))) goto fail; /* Creating database md_name */ if (!(c->db_md_name = open_db(package_get_item(c->package, "md_name", 1), 1))) goto fail; /* Creating database name_md */ if (!(c->db_name_md = open_db(package_get_item(c->package, "name_md", 1), 1))) goto fail; /* Creating database name_lastmd */ if (!(c->db_name_lastmd = open_db(package_get_item(c->package, "name_lastmd", 1), 0))) goto fail; /* Creating database md_lastname */ if (!(c->db_md_lastname = open_db(package_get_item(c->package, "md_lastname", 1), 0))) goto fail; /* Creating database version_timestamp */ if (!(c->db_version_timestamp = open_db(package_get_item(c->package, "version_timestamp", 1), 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); 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", 1), "w+"))) return -1; fprintf(f, "%i\n", c->timestamp); fclose(f); if (!(f = fopen(package_get_item(c->package, "version", 1), "w+"))) return -1; fprintf(f, "%u\n", c->version); fclose(f); if (!(f = fopen(package_get_item(c->package, "origin", 1), "w+"))) return -1; fprintf(f, "%s\n", c->origin); fclose(f); return package_save(c->package, filename); }