diff options
Diffstat (limited to 'nserver/src/db.c')
-rw-r--r-- | nserver/src/db.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/nserver/src/db.c b/nserver/src/db.c index 156ec01..32701b6 100644 --- a/nserver/src/db.c +++ b/nserver/src/db.c @@ -22,13 +22,11 @@ datum *mk_datum(char *data) return NULL; } - GDBM_FILE db_open(int flags) { return gdbm_open(DB_FILE, 0,flags, S_IRUSR|S_IWUSR, NULL); } - int db_init() { // Create DB if it's not already created. @@ -44,7 +42,6 @@ int db_init() return -1; } - int db_store(char *key, char *value) { datum *k_datum = NULL, *v_datum = NULL; @@ -93,3 +90,40 @@ int db_store(char *key, char *value) } return -1; } + +char *db_load(char *key) +{ + datum *k_datum = NULL; + GDBM_FILE gf = NULL; + + check(key != NULL && strlen(key) > 0, "key invalid"); + + // make key datum + k_datum = mk_datum(key); + check(k_datum != NULL, "key datum init failed"); + + // init db. + int rc = db_init(); + check(rc == 0, "db init failed"); + + // open the gdbm data in read mode + gf = db_open(GDBM_READER|GDBM_SYNC); + check(gf != NULL, "unable to open db in read mode"); + + // try to fetch value for key. + datum v_datum = gdbm_fetch(gf, *k_datum); + check(v_datum.dptr != NULL, "key not found"); + + // clean up. + free(k_datum); + + return v_datum.dptr; + error: + if (k_datum) { + free(k_datum); + } + if (gf) { + gdbm_close(gf); + } + return NULL; +} |