summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrsiddharth <s@ricketyspace.net>2020-04-11 11:27:21 -0400
committerrsiddharth <s@ricketyspace.net>2020-04-17 20:56:37 -0400
commit49edbb003a0aef0fd864e5f2a12228807618a175 (patch)
tree4e84f1d1382941f10800b549fa9590b75097ceb7
parent550c619a4ae80cd160260452369f0dcf7e7a0421 (diff)
nserver: Add db_load.
* nserver/src/db.c (db_load): New function definition. * nserver/src/db.h (db_load): New function declaration. * nserver/tests/db_tests.c (test_db_load): New test.
-rw-r--r--nserver/src/db.c40
-rw-r--r--nserver/src/db.h1
-rw-r--r--nserver/tests/db_tests.c17
3 files changed, 55 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;
+}
diff --git a/nserver/src/db.h b/nserver/src/db.h
index 68af98e..1a9c243 100644
--- a/nserver/src/db.h
+++ b/nserver/src/db.h
@@ -9,6 +9,7 @@
int db_init();
int db_store(char *key, char *value);
+char *db_load(char *key);
#endif
diff --git a/nserver/tests/db_tests.c b/nserver/tests/db_tests.c
index 33821bb..de93262 100644
--- a/nserver/tests/db_tests.c
+++ b/nserver/tests/db_tests.c
@@ -20,12 +20,29 @@ char *test_db_store()
return NULL;
}
+char *test_db_load()
+{
+ char *k = "hello";
+ char *expected_v = "kirk";
+
+ char *v = db_load(k);
+ mu_assert(v != NULL, "key not found");
+ mu_assert(strncmp(v, expected_v, strlen(expected_v)) == 0,
+ "incorrect value for key");
+
+ // cleanup.
+ free(v);
+
+ return NULL;
+}
+
char *all_tests()
{
mu_suite_start();
mu_run_test(test_db_init);
mu_run_test(test_db_store);
+ mu_run_test(test_db_load);
return NULL;
}