summaryrefslogtreecommitdiff
path: root/ext/kissdb/kissdb.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/kissdb/kissdb.h')
-rw-r--r--ext/kissdb/kissdb.h171
1 files changed, 171 insertions, 0 deletions
diff --git a/ext/kissdb/kissdb.h b/ext/kissdb/kissdb.h
new file mode 100644
index 00000000..b4e87954
--- /dev/null
+++ b/ext/kissdb/kissdb.h
@@ -0,0 +1,171 @@
+/* (Keep It) Simple Stupid Database
+ *
+ * Written by Adam Ierymenko <adam.ierymenko@zerotier.com>
+ * KISSDB is in the public domain and is distributed with NO WARRANTY. */
+
+#ifndef ___KISSDB_H
+#define ___KISSDB_H
+
+#include <stdio.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * Version: 2
+ *
+ * This is the file format identifier, and changes any time the file
+ * format changes. The code version will be this dot something, and can
+ * be seen in tags in the git repository.
+ */
+#define KISSDB_VERSION 2
+
+/**
+ * KISSDB database state
+ *
+ * These fields can be read by a user, e.g. to look up key_size and
+ * value_size, but should never be changed.
+ */
+typedef struct {
+ unsigned long hash_table_size;
+ unsigned long key_size;
+ unsigned long value_size;
+ unsigned long hash_table_size_bytes;
+ unsigned long num_hash_tables;
+ uint64_t *hash_tables;
+ FILE *f;
+} KISSDB;
+
+/**
+ * I/O error or file not found
+ */
+#define KISSDB_ERROR_IO -1
+
+/**
+ * Out of memory
+ */
+#define KISSDB_ERROR_MALLOC -2
+
+/**
+ * Invalid paramters (e.g. missing _size paramters on init to create database)
+ */
+#define KISSDB_ERROR_INVALID_PARAMETERS -3
+
+/**
+ * Database file appears corrupt
+ */
+#define KISSDB_ERROR_CORRUPT_DBFILE -4
+
+/**
+ * Open mode: read only
+ */
+#define KISSDB_OPEN_MODE_RDONLY 1
+
+/**
+ * Open mode: read/write
+ */
+#define KISSDB_OPEN_MODE_RDWR 2
+
+/**
+ * Open mode: read/write, create if doesn't exist
+ */
+#define KISSDB_OPEN_MODE_RWCREAT 3
+
+/**
+ * Open mode: truncate database, open for reading and writing
+ */
+#define KISSDB_OPEN_MODE_RWREPLACE 4
+
+/**
+ * Open database
+ *
+ * The three _size parameters must be specified if the database could
+ * be created or re-created. Otherwise an error will occur. If the
+ * database already exists, these parameters are ignored and are read
+ * from the database. You can check the struture afterwords to see what
+ * they were.
+ *
+ * @param db Database struct
+ * @param path Path to file
+ * @param mode One of the KISSDB_OPEN_MODE constants
+ * @param hash_table_size Size of hash table in 64-bit entries (must be >0)
+ * @param key_size Size of keys in bytes
+ * @param value_size Size of values in bytes
+ * @return 0 on success, nonzero on error
+ */
+extern int KISSDB_open(
+ KISSDB *db,
+ const char *path,
+ int mode,
+ unsigned long hash_table_size,
+ unsigned long key_size,
+ unsigned long value_size);
+
+/**
+ * Close database
+ *
+ * @param db Database struct
+ */
+extern void KISSDB_close(KISSDB *db);
+
+/**
+ * Get an entry
+ *
+ * @param db Database struct
+ * @param key Key (key_size bytes)
+ * @param vbuf Value buffer (value_size bytes capacity)
+ * @return -1 on I/O error, 0 on success, 1 on not found
+ */
+extern int KISSDB_get(KISSDB *db,const void *key,void *vbuf);
+
+/**
+ * Put an entry (overwriting it if it already exists)
+ *
+ * In the already-exists case the size of the database file does not
+ * change.
+ *
+ * @param db Database struct
+ * @param key Key (key_size bytes)
+ * @param value Value (value_size bytes)
+ * @return -1 on I/O error, 0 on success
+ */
+extern int KISSDB_put(KISSDB *db,const void *key,const void *value);
+
+/**
+ * Cursor used for iterating over all entries in database
+ */
+typedef struct {
+ KISSDB *db;
+ unsigned long h_no;
+ unsigned long h_idx;
+} KISSDB_Iterator;
+
+/**
+ * Initialize an iterator
+ *
+ * @param db Database struct
+ * @param i Iterator to initialize
+ */
+extern void KISSDB_Iterator_init(KISSDB *db,KISSDB_Iterator *dbi);
+
+/**
+ * Get the next entry
+ *
+ * The order of entries returned by iterator is undefined. It depends on
+ * how keys hash.
+ *
+ * @param Database iterator
+ * @param kbuf Buffer to fill with next key (key_size bytes)
+ * @param vbuf Buffer to fill with next value (value_size bytes)
+ * @return 0 if there are no more entries, negative on error, positive if an kbuf/vbuf have been filled
+ */
+extern int KISSDB_Iterator_next(KISSDB_Iterator *dbi,void *kbuf,void *vbuf);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+