Initial revision
authorewt <devnull@localhost>
Wed, 27 Dec 1995 03:41:22 +0000 (03:41 +0000)
committerewt <devnull@localhost>
Wed, 27 Dec 1995 03:41:22 +0000 (03:41 +0000)
CVS patchset: 82
CVS date: 1995/12/27 03:41:22

lib/dbindex.c [new file with mode: 0644]
lib/dbindex.h [new file with mode: 0644]

diff --git a/lib/dbindex.c b/lib/dbindex.c
new file mode 100644 (file)
index 0000000..2b35d5b
--- /dev/null
@@ -0,0 +1,96 @@
+#include <db.h>
+#include <stdlib.h>
+#include <strings.h>
+
+#include "dbindex.h"
+#include "rpmerr.h"
+
+dbIndex * openDBIndex(char * filename, int flags, int perms) {
+    dbIndex * db;
+        
+    db = malloc(sizeof(*db));
+    db->indexname = strdup(filename);
+    db->db = dbopen(filename, flags, perms, DB_HASH, NULL);
+    if (!db) {
+       free(db->indexname);
+       free(db);
+       error(RPMERR_DBOPEN, "cannot open file %s filename");
+       return NULL;
+    }
+
+    return db;
+}
+
+void closeDBIndex(dbIndex * dbi) {
+    dbi->db->close(dbi->db);
+    free(dbi->indexname);
+    free(dbi);
+}
+
+int searchDBIndex(dbIndex * dbi, char * str, dbIndexSet * set) {
+    DBT key, data;
+    int rc;
+
+    key.data = str;
+    key.size = strlen(str);
+
+    rc = dbi->db->get(dbi->db, &key, &data, 0);
+    if (rc == -1) {
+       error(RPMERR_DBGETINDEX, "error getting record %s from %s",
+               str, dbi->indexname);
+       return -1;
+    } else if (rc == 1) {
+       return 1;
+    } else {
+       set->recs = data.data;
+       set->recs = malloc(data.size);
+       memcpy(set->recs, data.data, data.size);
+       set->count = data.size / sizeof(dbIndexRecord);
+       return 0;
+    }
+}
+
+int updateDBIndex(dbIndex * dbi, char * str, dbIndexSet * set) {
+   /* 0 on success */
+    DBT key, data;
+    int rc;
+
+    key.data = str;
+    key.size = strlen(str);
+
+    data.data = set->recs;
+    data.size = set->count * sizeof(dbIndexRecord);
+
+    rc = dbi->db->put(dbi->db, &key, &data, 0);
+    if (rc) {
+       error(RPMERR_DBPUTINDEX, "error storing record %s into %s",
+               str, dbi->indexname);
+       return 1;
+    }
+
+    return 0;
+}
+
+int appendDBIndexRecord(dbIndexSet * set, dbIndexRecord rec) {
+    set->count++;
+
+    if (set->count == 1) {
+       set->recs = malloc(set->count * sizeof(dbIndexRecord));
+    } else {
+       set->recs = realloc(set->recs, set->count * sizeof(dbIndexRecord));
+    }
+    set->recs[set->count - 1] = rec;
+
+    return 0;
+}
+
+dbIndexSet createDBIndexRecord(void) {
+    dbIndexSet set;
+
+    set.count = 0;
+    return set;
+}
+    
+void freeDBIndexRecord(dbIndexSet set) {
+    free(set.recs);
+}
diff --git a/lib/dbindex.h b/lib/dbindex.h
new file mode 100644 (file)
index 0000000..286a50a
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef H_DBINDEX
+#define H_DBINDEX
+
+/* this will break if sizeof(int) != 4 */
+
+#include <db.h>
+
+typedef struct {
+    unsigned int recOffset;
+    unsigned int fileNumber;
+} dbIndexRecord;
+
+typedef struct {
+    dbIndexRecord * recs;
+    int count;
+} dbIndexSet;
+
+typedef struct {
+    DB * db;
+    char * indexname;
+} dbIndex;
+
+dbIndex * openDBIndex(char * filename, int flags, int perms);
+void closeDBIndex(dbIndex * dbi);
+int searchDBIndex(dbIndex * dbi, char * str, dbIndexSet * set);
+   /* -1 error, 0 success, 1 not found */
+int updateDBIndex(dbIndex * dbi, char * str, dbIndexSet * set);
+   /* 0 on success */
+int appendDBIndexRecord(dbIndexSet * set, dbIndexRecord rec);
+   /* 0 on success - should never fail */
+dbIndexSet createDBIndexRecord(void);
+void freeDBIndexRecord(dbIndexSet set);
+
+#endif