about summary refs log tree commit homepage
path: root/ext/tdb/tdb.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/tdb/tdb.c')
-rw-r--r--ext/tdb/tdb.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/ext/tdb/tdb.c b/ext/tdb/tdb.c
index 373da17..d1b573a 100644
--- a/ext/tdb/tdb.c
+++ b/ext/tdb/tdb.c
@@ -619,6 +619,28 @@ static VALUE lockall_unmark(VALUE self)
         return Qtrue;
 }
 
+/*
+ * clears out the database
+ */
+static VALUE clear(VALUE self)
+{
+        struct tdb_context *tdb = db(self, 1);
+        if ((int)my_tbr((rb_blocking_function_t *)tdb_wipe_all, tdb))
+                my_raise(tdb);
+        return self;
+}
+
+#ifdef HAVE_TDB_REPACK
+/* repacks a database to reduce fragmentation, available with tdb 1.2.x+ */
+static VALUE repack(VALUE self)
+{
+        struct tdb_context *tdb = db(self, 1);
+        if ((int)my_tbr((rb_blocking_function_t *)tdb_repack, tdb))
+                my_raise(tdb);
+        return self;
+}
+#endif /* HAVE_TDB_REPACK */
+
 void Init_tdb_ext(void)
 {
         cTDB = rb_define_class("TDB", rb_cObject);
@@ -663,6 +685,10 @@ void Init_tdb_ext(void)
         rb_define_method(cTDB, "unlockall_read", unlockall_read, 0);
         rb_define_method(cTDB, "lockall_mark", lockall_mark, 0);
         rb_define_method(cTDB, "lockall_unmark", lockall_unmark, 0);
+        rb_define_method(cTDB, "clear", clear, 0);
+#ifdef HAVE_TDB_REPACK
+        rb_define_method(cTDB, "repack", repack, 0);
+#endif /* HAVE_TDB_REPACK */
 
         init_errors();
         init_hashes();