[tracker/tracker-0.6] Added SQLite test utility



commit a903ffcfa035ac153f32b418f481da1383c77a62
Author: Martyn Russell <martyn imendio com>
Date:   Mon May 18 15:01:18 2009 +0100

    Added SQLite test utility
---
 configure.ac                             |    1 +
 src/libtracker-db/tracker-db-interface.h |    2 +-
 utils/Makefile.am                        |    3 +-
 utils/sqlite/Makefile.am                 |   18 ++
 utils/sqlite/query.c                     |  317 ++++++++++++++++++++++++++++++
 5 files changed, 339 insertions(+), 2 deletions(-)

diff --git a/configure.ac b/configure.ac
index 3ca3b71..5608155 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1426,6 +1426,7 @@ AC_CONFIG_FILES([
 	utils/Makefile
 	utils/albumart/Makefile
 	utils/qdbm/Makefile
+	utils/sqlite/Makefile
 	utils/tracker-fts/Makefile
 ])
 
diff --git a/src/libtracker-db/tracker-db-interface.h b/src/libtracker-db/tracker-db-interface.h
index ca16469..71952fc 100644
--- a/src/libtracker-db/tracker-db-interface.h
+++ b/src/libtracker-db/tracker-db-interface.h
@@ -70,7 +70,7 @@ struct TrackerDBInterfaceIface {
 
 };
 
-#define DISABLE_DEBUG
+#undef DISABLE_DEBUG
 
 #ifdef G_HAVE_ISO_VARARGS
 #  ifdef DISABLE_DEBUG
diff --git a/utils/Makefile.am b/utils/Makefile.am
index d024778..a7c271e 100644
--- a/utils/Makefile.am
+++ b/utils/Makefile.am
@@ -7,4 +7,5 @@ endif
 SUBDIRS = 			\
 	$(build_sqlite_fts)	\
 	albumart		\
-	qdbm
+	qdbm			\
+	sqlite
diff --git a/utils/sqlite/Makefile.am b/utils/sqlite/Makefile.am
new file mode 100644
index 0000000..297c75d
--- /dev/null
+++ b/utils/sqlite/Makefile.am
@@ -0,0 +1,18 @@
+include $(top_srcdir)/Makefile.decl
+
+noinst_PROGRAMS = query
+
+INCLUDES = 						\
+	$(WARN_CFLAGS)					\
+	$(GIO_CFLAGS)					\
+	$(GLIB2_CFLAGS)					\
+	$(SQLITE3_CFLAGS)
+
+query_SOURCES =						\
+	query.c
+
+query_LDADD =						\
+	$(GIO_LIBS)					\
+	$(GLIB2_LIBS)					\
+	$(SQLITE3_LIBS)
+
diff --git a/utils/sqlite/query.c b/utils/sqlite/query.c
new file mode 100644
index 0000000..19e8a5f
--- /dev/null
+++ b/utils/sqlite/query.c
@@ -0,0 +1,317 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2008, Nokia
+
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA  02110-1301, USA.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <locale.h>
+
+#include <sqlite3.h>
+
+#include <glib.h>
+#include <glib/gi18n.h>
+#include <gio/gio.h>
+
+static sqlite3_stmt *query_prepare (sqlite3      *db,
+                                    const gchar  *sql);
+static void          query_run     (sqlite3      *db,
+                                    sqlite3_stmt *stmt);
+static void          query_close   (sqlite3_stmt *stmt);
+
+static gchar	     *query;
+static gchar	    **attach_dbs;
+
+static GOptionEntry   entries[] = {
+	{ "query", 'q', 0, G_OPTION_ARG_STRING, &query,
+	  N_("SQL query to use"),
+	  N_("SQL")
+        },
+	{ G_OPTION_REMAINING, 0, 0,
+	  G_OPTION_ARG_FILENAME_ARRAY, &attach_dbs,
+	  N_("Files to attach"),
+	  N_("FILE")
+	},
+	{ NULL }
+};
+
+static sqlite3 *
+connection_open (void)
+{
+        sqlite3 *db = NULL;
+        int i;
+
+        /* Attach remaining dbs */
+        for (i = 0; attach_dbs[i] != NULL; i++) {
+                GFile *file;
+                gchar *path;
+
+                file = g_file_new_for_commandline_arg (attach_dbs[i]);
+		path = g_file_get_path (file);
+
+                if (file) {
+                        g_object_unref (file);
+                }               
+
+                if (i == 0) {
+                        int result;
+
+                        g_print ("Opening DB:'%s'\n", path);
+                        
+                        result = sqlite3_open (attach_dbs[0], &db);
+                        if (result) {
+                                const gchar *str = sqlite3_errmsg (db);
+                                
+                                g_printerr ("Couldn't open database:'%s', %s\n", 
+                                            path, str ? str : "no error given");
+
+                                sqlite3_close (db);
+                                g_free (path);
+
+                                break;
+                        }
+                } else {
+                        gchar *sql;
+                        sqlite3_stmt *stmt;
+                        
+                        sql = g_strdup_printf ("attach \"%s\" as \"%d\";", 
+                                               path, i);
+                        stmt = query_prepare (db, sql);
+                        g_free (sql);
+                        
+                        if (stmt) {
+                                query_run (db, stmt);
+                                query_close (stmt);
+                        }
+                }
+                
+                g_free (path);
+        }
+
+        return db;
+}
+
+static void
+connection_close (sqlite3 *db)
+{
+        g_print ("Closing DB\n");
+        sqlite3_close (db);   
+}
+
+static sqlite3_stmt *
+query_prepare (sqlite3     *db, 
+               const gchar *sql)
+{
+        sqlite3_stmt *stmt;
+        int result;
+
+        g_print ("Preparing query: '%s'\n", sql);
+
+        result = sqlite3_prepare_v2 (db, sql, -1, &stmt, NULL);
+        if (result != SQLITE_OK) {
+                const gchar *str = sqlite3_errmsg (db);
+
+                g_printerr ("Couldn't prepare query, error:%d->'%s'\n", 
+                            result, str ? str : "no error given");
+
+                return NULL;
+        }       
+
+        return stmt;
+}
+
+static void
+query_run (sqlite3      *db,
+           sqlite3_stmt *stmt) 
+{
+        int result;
+        int row = 0;
+
+        g_print ("Running query: %p\n", stmt);
+
+        while ((result = sqlite3_step (stmt)) != SQLITE_DONE) {
+                switch (result) {
+                case SQLITE_BUSY:
+                        g_print ("Database is busy, waiting 1 second...\n");
+                        g_usleep (G_USEC_PER_SEC);
+                        break;
+
+                case SQLITE_ERROR:
+                        g_printerr ("Database error, %s\n", 
+                                    sqlite3_errmsg (db) ? sqlite3_errmsg (db) : "no error given");
+                        break;
+
+                case SQLITE_ROW: {
+                        int i;
+
+                        g_print ("[ROW %5.5d]\n", ++row);
+
+                        for (i = 0; i < sqlite3_column_count (stmt); i++) {
+                                int t;
+
+                                t = sqlite3_column_type (stmt, i);
+
+                                switch (t) {
+                                case SQLITE_TEXT:
+                                        g_print ("  [ text] %s = %s", 
+                                                 sqlite3_column_name (stmt, i),
+                                                 sqlite3_column_text (stmt, i));
+                                        break;
+
+                                case SQLITE_INTEGER:
+                                        g_print ("  [  int] %s = %d", 
+                                                 sqlite3_column_name (stmt, i),
+                                                 sqlite3_column_int (stmt, i));
+                                        break;
+
+                                case SQLITE_FLOAT:
+                                        g_print ("  [float] %s = %f", 
+                                                 sqlite3_column_name (stmt, i),
+                                                 sqlite3_column_double (stmt, i));
+                                        break;
+
+                                case SQLITE_BLOB:
+                                        g_print ("  [ blob] %s = ?", 
+                                                 sqlite3_column_name (stmt, i));
+                                        break;
+
+                                case SQLITE_NULL:
+                                        g_print ("  [ null] %s = empty", 
+                                                 sqlite3_column_name (stmt, i));
+                                        break;
+
+                                default:
+                                        g_print ("  [?????] %s = (unknown:%d)", 
+                                                 sqlite3_column_name (stmt, i),
+                                                 t);
+                                        break;
+                                }
+
+                                g_print ("\n");
+                        }
+
+                        break;
+                }
+                }
+        }
+
+        g_print ("Done\n");
+}
+
+static void 
+query_close (sqlite3_stmt *stmt)
+{
+        g_print ("Closing query\n");
+
+        sqlite3_reset (stmt);
+        sqlite3_finalize (stmt);
+}
+
+int 
+main (int argc, char *argv[]) 
+{
+	GOptionContext *context;
+        gchar *summary;
+        sqlite3 *db;
+        sqlite3_stmt *stmt;
+
+	setlocale (LC_ALL, "");
+
+        g_type_init ();
+
+	context = g_option_context_new (_ ("- Test SQLite databases with queries"));
+	summary = g_strconcat (_("You can use this utility to attach DBs and "
+                                 "run queries using the SQLite API"),
+                               "\n"
+                               "\n"
+                               "Example 1. Get options:\n"
+                               "\n"
+                               "  -q \"SELECT * FROM Options;\" ~/.local/share/tracker/data/common.db\n",
+                               "\n"
+                               "Example 2. Get Services table count:\n"
+                               "\n"
+                               "  -q \"SELECT COUNT(0) FROM Services;\" ~/.cache/tracker/file-meta.db\n",
+                               "\n"
+                               "Example 3. Get statistics: (you will need to common.db & file-meta.db)\n"
+                               "\n"
+                               "  SELECT T.TypeName, COUNT(1)\n"
+                               "  FROM Services S, ServiceTypes T\n"
+                               "  WHERE\n"
+                               "    S.AuxilaryID IN (SELECT VolumeID FROM Volumes WHERE Enabled = 1)\n"
+                               "  AND\n"
+                               "    S.Enabled = 1 AND T.TypeID=S.ServiceTypeID\n"
+                               "  GROUP BY ServiceTypeID\n"
+                               "  ORDER BY T.TypeName;",
+                               NULL);
+
+	g_option_context_set_summary (context, summary);
+	g_option_context_add_main_entries (context, entries, NULL);
+	g_option_context_parse (context, &argc, &argv, NULL);
+	g_free (summary);
+
+	if (!query || !*query) {
+		gchar *help;
+
+		g_printerr ("%s\n\n",
+			    _ ("No query was provided"));
+
+		help = g_option_context_get_help (context, TRUE, NULL);
+		g_option_context_free (context);
+		g_printerr ("%s", help);
+		g_free (help);
+
+		return EXIT_FAILURE;
+	}
+
+	if (!attach_dbs || !*attach_dbs) {
+		gchar *help;
+
+		g_printerr ("%s\n\n",
+			    _ ("No databases were provided"));
+
+		help = g_option_context_get_help (context, TRUE, NULL);
+		g_option_context_free (context);
+		g_printerr ("%s", help);
+		g_free (help);
+
+		return EXIT_FAILURE;
+	}
+
+	g_option_context_free (context);
+
+        /* Start DB stuff */
+        db = connection_open ();
+
+        if (!db) {
+                return EXIT_FAILURE;
+        }
+
+        stmt = query_prepare (db, query);
+
+        if (!stmt) {
+                connection_close (db);
+                return EXIT_FAILURE;
+        }
+
+        query_run (db, stmt);
+       
+        query_close (stmt);
+        connection_close (db);
+       
+        return EXIT_SUCCESS;
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]