summaryrefslogtreecommitdiffstats
path: root/src/rccdb4.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/rccdb4.c')
-rw-r--r--src/rccdb4.c124
1 files changed, 124 insertions, 0 deletions
diff --git a/src/rccdb4.c b/src/rccdb4.c
new file mode 100644
index 0000000..795b721
--- /dev/null
+++ b/src/rccdb4.c
@@ -0,0 +1,124 @@
+#include <stdio.h>
+
+#include "internal.h"
+#include "rccdb4.h"
+
+#define DATABASE "autolearn.db"
+#define MIN_CHARS 3
+
+int rccInitDb4(rcc_context ctx, const char *name, rcc_db4_flags flags) {
+ size_t size;
+ char *dbname;
+
+ if (!ctx) {
+ if (rcc_default_ctx) ctx = rcc_default_ctx;
+ else return -1;
+ }
+
+ if (!name) name = "default";
+
+ size = strlen(rcc_home_dir) + strlen(name) + 32;
+ dbname = (char*)malloc(size*sizeof(char));
+ if (!dbname) return -1;
+
+ sprintf(dbname,"%s/.rcc/",rcc_home_dir);
+ mkdir(dbname, 00644);
+
+ sprintf(dbname,"%s/.rcc/%s.db/",rcc_home_dir,name);
+ mkdir(dbname, 00644);
+
+ ctx->db4ctx = rccDb4CreateContext(dbname, flags);
+ free(dbname);
+
+ if (!ctx->db4ctx) return -1;
+
+ return 0;
+}
+
+db4_context rccDb4CreateContext(const char *dbpath, rcc_db4_flags flags) {
+ int err;
+ db4_context ctx;
+ DB_ENV *dbe;
+ DB *db;
+
+ err = db_env_create(&dbe, 0);
+ if (err) return NULL;
+
+ err = dbe->open(dbe, dbpath, DB_CREATE|DB_INIT_CDB|DB_INIT_MPOOL, 0);
+ if (err) {
+ dbe->close(dbe, 0);
+ return NULL;
+ }
+
+ err = db_create(&db, dbe, 0);
+ if (err) {
+ dbe->close(dbe, 0);
+ return NULL;
+ }
+
+ err = db->open(db, NULL, DATABASE, NULL, DB_BTREE, DB_CREATE, 0);
+ if (err) {
+ db->close(db, 0);
+ dbe->close(dbe, 0);
+ return NULL;
+ }
+
+ ctx = (db4_context)malloc(sizeof(db4_context_s));
+ if (!ctx) {
+ db->close(db, 0);
+ dbe->close(dbe, 0);
+ return NULL;
+ }
+
+ ctx->db = db;
+ ctx->dbe = dbe;
+ ctx->flags = flags;
+ return ctx;
+}
+
+void rccDb4FreeContext(db4_context ctx) {
+ if (ctx) {
+ ctx->db->close(ctx->db, 0);
+ ctx->dbe->close(ctx->dbe, 0);
+ free(ctx);
+ }
+}
+
+int rccDb4SetKey(db4_context ctx, const char *orig, size_t olen, const rcc_string string, size_t slen) {
+ int err;
+ DBT key, data;
+
+ if ((!ctx)||(!orig)||(!string)) return -1;
+
+ memset(&key, 0, sizeof(key));
+ memset(&data, 0, sizeof(data));
+
+ key.data = (char*)orig;
+ key.size = STRNLEN(orig, olen);
+ data.data = (char*)string;
+ data.size = STRNLEN(string, slen);
+
+ if (key.size < MIN_CHARS) return -1;
+
+ err = ctx->db->put(ctx->db, NULL, &key, &data, 0);
+ return err;
+}
+
+rcc_string rccDb4GetKey(db4_context ctx, const char *orig, size_t olen) {
+ int err;
+ DBT key, data;
+
+ if ((!ctx)||(!orig)) return NULL;
+
+ memset(&key, 0, sizeof(key));
+ memset(&data, 0, sizeof(data));
+
+ key.data = (char*)orig;
+ key.size = STRNLEN(orig, olen);
+
+ data.flags = DB_DBT_REALLOC;
+
+ err = ctx->db->get(ctx->db, NULL, &key, &data, 0);
+ if (err) return NULL;
+ return data.data;
+}