aboutsummaryrefslogtreecommitdiffstats
path: root/src/db_debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/db_debug.c')
-rw-r--r--src/db_debug.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/db_debug.c b/src/db_debug.c
new file mode 100644
index 0000000..13ccdd6
--- /dev/null
+++ b/src/db_debug.c
@@ -0,0 +1,86 @@
+/*
+ * libtalloc based memory allocator for SQLite3.
+ *
+ * (C) 2019 by Vadim Yanitskiy <axilirator@gmail.com>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include <sqlite3.h>
+#include <talloc.h>
+#include <errno.h>
+
+/* Dedicated talloc context for SQLite */
+static void *db_sqlite_ctx = NULL;
+
+static void *tall_xMalloc(int size)
+{
+ return talloc_size(db_sqlite_ctx, size);
+}
+
+static void tall_xFree(void *ptr)
+{
+ talloc_free(ptr);
+}
+
+static void *tall_xRealloc(void *ptr, int size)
+{
+ return talloc_realloc_fn(db_sqlite_ctx, ptr, size);
+}
+
+static int tall_xSize(void *ptr)
+{
+ return talloc_total_size(ptr);
+}
+
+/* DUMMY: talloc doesn't round up the allocation size */
+static int tall_xRoundup(int size) { return size; }
+
+/* DUMMY: nothing to initialize */
+static int tall_xInit(void *data) { return 0; }
+
+/* DUMMY: nothing to deinitialize */
+static void tall_xShutdown(void *data) { }
+
+/* Interface between SQLite and talloc memory allocator */
+static const struct sqlite3_mem_methods tall_sqlite_if = {
+ /* Memory allocation function */
+ .xMalloc = &tall_xMalloc,
+ /* Free a prior allocation */
+ .xFree = &tall_xFree,
+ /* Resize an allocation */
+ .xRealloc = &tall_xRealloc,
+ /* Return the size of an allocation */
+ .xSize = &tall_xSize,
+ /* Round up request size to allocation size */
+ .xRoundup = &tall_xRoundup,
+ /* Initialize the memory allocator */
+ .xInit = &tall_xInit,
+ /* Deinitialize the memory allocator */
+ .xShutdown = &tall_xShutdown,
+ /* Argument to xInit() and xShutdown() */
+ .pAppData = NULL,
+};
+
+int db_sqlite3_use_talloc(void *ctx)
+{
+ if (db_sqlite_ctx != NULL)
+ return -EEXIST;
+
+ db_sqlite_ctx = talloc_named_const(ctx, 0, "SQLite3");
+ return sqlite3_config(SQLITE_CONFIG_MALLOC, &tall_sqlite_if);
+}