From e4963aa324bb8021550366eca814346baecda03d Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Wed, 23 Nov 2011 00:23:41 +0100 Subject: [PATCH] Introduce midori_array_query to unify bookmark queries This ensures querying is consistently quoted and ordered. --- midori/midori-array.c | 46 +++++++++++++++++++++++++++++++++++++++ midori/midori-array.h | 6 +++++ midori/midori-browser.c | 35 +++++++---------------------- panels/midori-bookmarks.c | 45 ++++++-------------------------------- 4 files changed, 67 insertions(+), 65 deletions(-) diff --git a/midori/midori-array.c b/midori/midori-array.c index fe40f907..66f089c1 100644 --- a/midori/midori-array.c +++ b/midori/midori-array.c @@ -1065,3 +1065,49 @@ katze_array_from_sqlite (sqlite3* db, return katze_array_from_statement (stmt); } + +/** + * midori_array_query: + * @array: the main bookmark array + * @fields: comma separated list of fields + * @condition: condition, like "folder = '%q'" + * @value: a value to be inserted if @condition contains %q + * + * Stores the result in a #KatzeArray. + * + * Return value: a #KatzeArray on success, %NULL otherwise + * + * Since: 0.4.3 + **/ +KatzeArray* +midori_array_query (KatzeArray* bookmarks, + const gchar* fields, + const gchar* condition, + const gchar* value) +{ + sqlite3* db; + gchar* sqlcmd; + char* sqlcmd_value; + KatzeArray* array; + + g_return_val_if_fail (KATZE_IS_ARRAY (bookmarks), NULL); + g_return_val_if_fail (fields, NULL); + g_return_val_if_fail (condition, NULL); + db = g_object_get_data (G_OBJECT (bookmarks), "db"); + if (db == NULL) + return NULL; + + sqlcmd = g_strdup_printf ("SELECT %s FROM bookmarks WHERE %s " + "ORDER BY title DESC", fields, condition); + if (strstr (condition, "%q")) + { + sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : ""); + array = katze_array_from_sqlite (db, sqlcmd_value); + sqlite3_free (sqlcmd_value); + } + else + array = katze_array_from_sqlite (db, sqlcmd); + g_free (sqlcmd); + return array; +} + diff --git a/midori/midori-array.h b/midori/midori-array.h index a0cac614..35b4e17c 100644 --- a/midori/midori-array.h +++ b/midori/midori-array.h @@ -30,6 +30,12 @@ midori_array_to_file (KatzeArray* array, KatzeArray* katze_array_from_statement (sqlite3_stmt* stmt); +KatzeArray* +midori_array_query (KatzeArray* array, + const gchar* fields, + const gchar* condition, + const gchar* value); + KatzeArray* katze_array_from_sqlite (sqlite3* db, const gchar* sqlcmd); diff --git a/midori/midori-browser.c b/midori/midori-browser.c index f93a66cf..6878f1e6 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -2951,26 +2951,20 @@ _action_bookmarks_populate_folder (GtkAction* action, KatzeArray* folder, MidoriBrowser* browser) { - const char* sqlcmd = "SELECT uri, title, app, folder " - "FROM bookmarks WHERE folder = '%q' ORDER BY uri ASC"; - sqlite3* db = g_object_get_data (G_OBJECT (browser->bookmarks), "db"); const gchar* folder_name; - char* sqlcmd_folder; KatzeArray* bookmarks; GtkWidget* menuitem; - if (!db) + folder_name = katze_item_get_name (KATZE_ITEM (folder)); + if (!(bookmarks = midori_array_query (browser->bookmarks, + "uri, title, app, folder", "folder = '%q'", folder_name))) return FALSE; /* Clear items from dummy array here */ gtk_container_foreach (GTK_CONTAINER (menu), (GtkCallback)(gtk_widget_destroy), NULL); - folder_name = katze_item_get_name (KATZE_ITEM (folder)); - sqlcmd_folder = sqlite3_mprintf (sqlcmd, folder_name ? folder_name : ""); - bookmarks = katze_array_from_sqlite (db, sqlcmd_folder); - sqlite3_free (sqlcmd_folder); - if (!bookmarks || katze_array_is_empty (bookmarks)) + if (katze_array_is_empty (bookmarks)) { menuitem = gtk_image_menu_item_new_with_label (_("Empty")); gtk_widget_set_sensitive (menuitem, FALSE); @@ -6741,8 +6735,6 @@ midori_bookmarkbar_remove_item_cb (KatzeArray* bookmarks, static void midori_bookmarkbar_populate (MidoriBrowser* browser) { - sqlite3* db; - const gchar* sqlcmd; KatzeArray* array; KatzeItem* item; @@ -6752,14 +6744,8 @@ midori_bookmarkbar_populate (MidoriBrowser* browser) gtk_toolbar_insert (GTK_TOOLBAR (browser->bookmarkbar), gtk_separator_tool_item_new (), -1); - db = g_object_get_data (G_OBJECT (browser->bookmarks), "db"); - if (!db) - return; - - sqlcmd = "SELECT uri, title, desc, app, folder, toolbar FROM bookmarks WHERE " - " toolbar = 1 ORDER BY uri ASC"; - - array = katze_array_from_sqlite (db, sqlcmd); + array = midori_array_query (browser->bookmarks, + "uri, title, desc, app, folder, toolbar", "toolbar = 1", NULL); if (!array) { _action_set_sensitive (browser, "BookmarkAdd", FALSE); @@ -6773,15 +6759,10 @@ midori_bookmarkbar_populate (MidoriBrowser* browser) midori_bookmarkbar_insert_item (browser->bookmarkbar, item); else { - KatzeArray* subfolder; - gchar* subsqlcmd; - - subsqlcmd = g_strdup_printf ("SELECT uri, title, desc, app FROM bookmarks WHERE " - " folder = '%s' and uri != ''", katze_item_get_name (item)); - subfolder = katze_array_from_sqlite (db, subsqlcmd); + KatzeArray* subfolder = midori_array_query (browser->bookmarks, + "uri, title, desc, app", "folder = '%q' AND uri != ''", katze_item_get_name (item)); katze_item_set_name (KATZE_ITEM (subfolder), katze_item_get_name (item)); midori_bookmarkbar_insert_item (browser->bookmarkbar, KATZE_ITEM (subfolder)); - g_free (subsqlcmd); } } _action_set_sensitive (browser, "BookmarkAdd", TRUE); diff --git a/panels/midori-bookmarks.c b/panels/midori-bookmarks.c index 15d27b2a..ec6d3211 100644 --- a/panels/midori-bookmarks.c +++ b/panels/midori-bookmarks.c @@ -124,19 +124,13 @@ midori_bookmarks_export_array_db (sqlite3* db, KatzeArray* array, const gchar* folder) { - gchar* sqlcmd; KatzeArray* root_array; KatzeArray* subarray; KatzeItem* item; GList* list; - if (!db) + if (!(root_array = midori_array_query (array, "*", "folder='%q'", folder))) return; - - sqlcmd = g_strdup_printf ("SELECT * FROM bookmarks where folder='%s'", folder); - root_array = katze_array_from_sqlite (db, sqlcmd); - g_free (sqlcmd); - KATZE_ARRAY_FOREACH_ITEM_L (item, root_array, list) { if (KATZE_ITEM_IS_FOLDER (item)) @@ -177,40 +171,15 @@ midori_bookmarks_read_from_db (MidoriBookmarks* bookmarks, const gchar* folder, const gchar* keyword) { - sqlite3* db; - sqlite3_stmt* statement; - gint result; - const gchar* sqlcmd; - - db = g_object_get_data (G_OBJECT (bookmarks->array), "db"); - - if (!db) - return katze_array_new (KATZE_TYPE_ITEM); + KatzeArray* array; if (keyword && *keyword) - { - gchar* filterstr; - sqlcmd = "SELECT uri, title, desc, app, toolbar, folder from bookmarks where " - " title like ? ORDER BY uri DESC"; - result = sqlite3_prepare_v2 (db, sqlcmd, -1, &statement, NULL); - filterstr = g_strdup_printf ("%%%s%%", keyword); - sqlite3_bind_text (statement, 1, g_strdup (filterstr), -1, g_free); - g_free (filterstr); - } + array = midori_array_query (bookmarks->array, + "uri, title, desc, app, toolbar, folder", "title LIKE '%%%q%%'", keyword); else - { - if (!folder) - folder = ""; - sqlcmd = "SELECT uri, title, desc, app, toolbar, folder from bookmarks where " - " folder = ? ORDER BY title DESC"; - result = sqlite3_prepare_v2 (db, sqlcmd, -1, &statement, NULL); - sqlite3_bind_text (statement, 1, g_strdup (folder), -1, g_free); - } - - if (result != SQLITE_OK) - return katze_array_new (KATZE_TYPE_ITEM); - - return katze_array_from_statement (statement); + array = midori_array_query (bookmarks->array, + "uri, title, desc, app, toolbar, folder", "folder = '%q'", folder); + return array ? array : katze_array_new (KATZE_TYPE_ITEM); } static void