summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShaun McCance <shaunm@gnome.org>2011-02-10 17:52:01 -0500
committerShaun McCance <shaunm@gnome.org>2011-02-10 19:35:20 -0500
commit65ad43b5b7cf6caa819bb0cbd39402e54e1d5f79 (patch)
tree7198be25c0619b1e694abaf079b4a9cb1722fe40
parent4d880e18527367ef0adcb5f9b0cfa25cda34ae6b (diff)
downloadyelp-65ad43b5b7cf6caa819bb0cbd39402e54e1d5f79.tar.gz
yelp-sqlite-storage: Hooking up update and search
-rw-r--r--libyelp/yelp-sqlite-storage.c86
1 files changed, 75 insertions, 11 deletions
diff --git a/libyelp/yelp-sqlite-storage.c b/libyelp/yelp-sqlite-storage.c
index 17a987d1..57ad1884 100644
--- a/libyelp/yelp-sqlite-storage.c
+++ b/libyelp/yelp-sqlite-storage.c
@@ -55,6 +55,7 @@ typedef struct _YelpSqliteStoragePrivate YelpSqliteStoragePrivate;
struct _YelpSqliteStoragePrivate {
gchar *filename;
sqlite3 *db;
+ GMutex *mutex;
};
enum {
@@ -78,25 +79,45 @@ yelp_sqlite_storage_finalize (GObject *object)
if (priv->db)
sqlite3_close (priv->db);
+ if (priv->mutex)
+ g_mutex_free (priv->mutex);
+
G_OBJECT_CLASS (yelp_sqlite_storage_parent_class)->finalize (object);
}
static void
yelp_sqlite_storage_init (YelpSqliteStorage *storage)
{
+ YelpSqliteStoragePrivate *priv = GET_PRIV (storage);
+ priv->mutex = g_mutex_new ();
}
static void
yelp_sqlite_storage_constructed (GObject *object)
{
+ int status;
+ sqlite3_stmt *stmt = NULL;
YelpSqliteStoragePrivate *priv = GET_PRIV (object);
if (priv->filename != NULL)
- sqlite3_open (priv->filename, &(priv->db));
+ status = sqlite3_open (priv->filename, &(priv->db));
else
- sqlite3_open (":memory:", &(priv->db));
-
- /* FIXME: create tables if necessary */
+ status = sqlite3_open (":memory:", &(priv->db));
+
+ if (status != SQLITE_OK)
+ return;
+
+ status = sqlite3_prepare_v2 (priv->db,
+ "create virtual table pages using fts4("
+ " doc_uri, lang, full_uri,"
+ " title, desc, icon, body"
+ ");",
+ -1, &stmt, NULL);
+ if (status != SQLITE_OK)
+ return;
+
+ sqlite3_step (stmt);
+ sqlite3_finalize (stmt);
}
static void
@@ -187,6 +208,35 @@ yelp_sqlite_storage_update (YelpStorage *storage,
const gchar *icon,
const gchar *text)
{
+ sqlite3_stmt *stmt = NULL;
+ YelpSqliteStoragePrivate *priv = GET_PRIV (storage);
+
+ g_mutex_lock (priv->mutex);
+
+ sqlite3_prepare_v2 (priv->db,
+ "delete from pages where doc_uri = ? and lang = ? and full_uri = ?;",
+ -1, &stmt, NULL);
+ sqlite3_bind_text (stmt, 1, doc_uri, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_text (stmt, 2, g_get_language_names()[0], -1, SQLITE_STATIC);
+ sqlite3_bind_text (stmt, 3, full_uri, -1, SQLITE_TRANSIENT);
+ sqlite3_step (stmt);
+ sqlite3_finalize (stmt);
+
+ sqlite3_prepare_v2 (priv->db,
+ "insert into pages (doc_uri, lang, full_uri, title, desc, icon, body)"
+ " values (?, ?, ?, ?, ?, ?, ?);",
+ -1, &stmt, NULL);
+ sqlite3_bind_text (stmt, 1, doc_uri, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_text (stmt, 2, g_get_language_names()[0], -1, SQLITE_STATIC);
+ sqlite3_bind_text (stmt, 3, full_uri, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_text (stmt, 4, title, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_text (stmt, 5, desc, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_text (stmt, 6, icon, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_text (stmt, 7, text, -1, SQLITE_TRANSIENT);
+ sqlite3_step (stmt);
+ sqlite3_finalize (stmt);
+
+ g_mutex_unlock (priv->mutex);
}
static GVariant *
@@ -194,19 +244,33 @@ yelp_sqlite_storage_search (YelpStorage *storage,
const gchar *doc_uri,
const gchar *text)
{
+ sqlite3_stmt *stmt = NULL;
GVariantBuilder builder;
GVariant *ret;
- int i;
+ YelpSqliteStoragePrivate *priv = GET_PRIV (storage);
+
+ g_mutex_lock (priv->mutex);
+
+ sqlite3_prepare_v2 (priv->db,
+ "select full_uri, title, desc, icon from pages where"
+ " doc_uri = ? and lang = ? and body match ?;",
+ -1, &stmt, NULL);
+ sqlite3_bind_text (stmt, 1, doc_uri, -1, SQLITE_TRANSIENT);
+ sqlite3_bind_text (stmt, 2, g_get_language_names()[0], -1, SQLITE_STATIC);
+ sqlite3_bind_text (stmt, 3, text, -1, SQLITE_TRANSIENT);
- /* FIXME */
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(ssss)"));
- for (i = 0; i < 1; i++) {
+ while (sqlite3_step (stmt) == SQLITE_ROW) {
g_variant_builder_add (&builder, "(ssss)",
- doc_uri,
- doc_uri,
- "Description",
- "help-contents");
+ sqlite3_column_text (stmt, 0),
+ sqlite3_column_text (stmt, 1),
+ sqlite3_column_text (stmt, 2),
+ sqlite3_column_text (stmt, 3));
}
+ sqlite3_finalize (stmt);
ret = g_variant_new ("a(ssss)", &builder);
+
+ g_mutex_unlock (priv->mutex);
+
return ret;
}