From de89bcd2dca283e0e93b0d5fe1ce6d881c7b42cc Mon Sep 17 00:00:00 2001 From: Christian Dywan Date: Mon, 22 Feb 2010 23:49:27 +0100 Subject: [PATCH] Store searches and completion search in the location --- midori/main.c | 12 ++++++-- midori/midori-browser.c | 28 +++++++++++++++++++ midori/midori-locationaction.c | 51 +++++++++++++++++++++++----------- 3 files changed, 72 insertions(+), 19 deletions(-) diff --git a/midori/main.c b/midori/main.c index eed17136..70eb1b06 100644 --- a/midori/main.c +++ b/midori/main.c @@ -368,9 +368,15 @@ midori_history_initialize (KatzeArray* array, } if (sqlite3_exec (db, - "CREATE TABLE IF NOT EXISTS " - "history(uri text, title text, date integer, day integer)", - NULL, NULL, errmsg) != SQLITE_OK) + "CREATE TABLE IF NOT EXISTS " + "history (uri text, title text, date integer, day integer);" + "CREATE TABLE IF NOT EXISTS " + "search (keywords text, uri text, day integer);" + "CREATE TEMP VIEW history_view AS SELECT " + "1 AS type, uri, title FROM history;" + "CREATE TEMP VIEW search_view AS SELECT " + "2 AS type, uri, keywords AS title FROM search;", + NULL, NULL, errmsg) != SQLITE_OK) return NULL; sqlite3_prepare_v2 (db, "SELECT day FROM history LIMIT 1", -1, &stmt, NULL); diff --git a/midori/midori-browser.c b/midori/midori-browser.c index f5906e2c..f5c41d65 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -3853,6 +3853,12 @@ _action_location_submit_uri (GtkAction* action, gchar** parts; gchar* keywords = NULL; const gchar* search_uri = NULL; + #if HAVE_SQLITE + time_t now; + gint64 day; + sqlite3* db; + static sqlite3_stmt* statement = NULL; + #endif /* Do we have a keyword and a string? */ parts = g_strsplit (stripped_uri, " ", 2); @@ -3876,6 +3882,28 @@ _action_location_submit_uri (GtkAction* action, } new_uri = sokoke_search_uri (search_uri, keywords); + #if HAVE_SQLITE + now = time (NULL); + day = sokoke_time_t_to_julian (&now); + + db = g_object_get_data (G_OBJECT (browser->history), "db"); + if (!statement) + { + const gchar* sqlcmd; + sqlcmd = "INSERT INTO search (keywords, uri, day) VALUES (?,?,?)"; + sqlite3_prepare_v2 (db, sqlcmd, strlen (sqlcmd) + 1, &statement, NULL); + } + sqlite3_bind_text (statement, 1, keywords, -1, 0); + sqlite3_bind_text (statement, 2, search_uri, -1, 0); + sqlite3_bind_int64 (statement, 3, day); + + if (sqlite3_step (statement) != SQLITE_DONE) + g_printerr (_("Failed to insert new history item: %s\n"), + sqlite3_errmsg (db)); + sqlite3_reset (statement); + sqlite3_clear_bindings (statement); + #endif + g_free (keywords); } else diff --git a/midori/midori-locationaction.c b/midori/midori-locationaction.c index 1ab63c76..b10a9fc8 100644 --- a/midori/midori-locationaction.c +++ b/midori/midori-locationaction.c @@ -87,6 +87,7 @@ enum VISIBLE_COL, YALIGN_COL, BACKGROUND_COL, + STYLE_COL, N_COLS }; @@ -268,7 +269,8 @@ midori_location_action_create_model (void) { GtkTreeModel* model = (GtkTreeModel*) gtk_list_store_new (N_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_FLOAT, GDK_TYPE_COLOR); + G_TYPE_INT, G_TYPE_BOOLEAN, G_TYPE_FLOAT, + GDK_TYPE_COLOR, G_TYPE_BOOLEAN); return model; } @@ -341,6 +343,7 @@ midori_location_action_popup_timeout_cb (gpointer data) static sqlite3_stmt* stmt; const gchar* sqlcmd; gint matches, searches, height, screen_height, sep; + GtkStyle* style; if (!gtk_widget_has_focus (action->entry) || !action->history) return FALSE; @@ -355,13 +358,16 @@ midori_location_action_popup_timeout_cb (gpointer data) { sqlite3* db; db = g_object_get_data (G_OBJECT (action->history), "db"); - sqlcmd = "SELECT uri, title FROM history WHERE uri LIKE ? OR title LIKE ?" - " GROUP BY uri ORDER BY count() DESC LIMIT ?"; - sqlite3_prepare_v2 (db, sqlcmd, -1, &stmt, NULL); + sqlcmd = "SELECT type, uri, title, count() AS ct FROM history_view " + "WHERE uri LIKE ?1 OR title LIKE ?1 GROUP BY uri " + "UNION ALL " + "SELECT type, uri, title, count() AS ct FROM search_view " + "WHERE title LIKE ?1 GROUP BY uri " + "ORDER BY ct DESC LIMIT ?2"; + sqlite3_prepare_v2 (db, sqlcmd, strlen (sqlcmd) + 1, &stmt, NULL); } sqlite3_bind_text (stmt, 1, g_strdup_printf ("%%%s%%", action->key), -1, g_free); - sqlite3_bind_text (stmt, 2, g_strdup_printf ("%%%s%%", action->key), -1, g_free); - sqlite3_bind_int64 (stmt, 3, MAX_ITEMS); + sqlite3_bind_int64 (stmt, 2, MAX_ITEMS); result = sqlite3_step (stmt); if (result != SQLITE_ROW && !action->search_engines) @@ -429,16 +435,30 @@ midori_location_action_popup_timeout_cb (gpointer data) gtk_list_store_clear (store); matches = searches = 0; + style = gtk_widget_get_style (action->treeview); while (result == SQLITE_ROW) { - const unsigned char* uri = sqlite3_column_text (stmt, 0); - const unsigned char* title = sqlite3_column_text (stmt, 1); + sqlite3_int64 type = sqlite3_column_int64 (stmt, 0); + const unsigned char* uri = sqlite3_column_text (stmt, 1); + const unsigned char* title = sqlite3_column_text (stmt, 2); GdkPixbuf* icon = katze_load_cached_icon ((gchar*)uri, NULL); if (!icon) icon = action->default_icon; - gtk_list_store_insert_with_values (store, NULL, matches, - URI_COL, uri, TITLE_COL, title, YALIGN_COL, 0.25, - FAVICON_COL, icon, -1); + if (type == 1 /* history_view */) + gtk_list_store_insert_with_values (store, NULL, matches, + URI_COL, uri, TITLE_COL, title, YALIGN_COL, 0.25, + FAVICON_COL, icon, -1); + else if (type == 2 /* search_view */) + { + gchar* search_uri = sokoke_search_uri ((gchar*)uri, (gchar*)title); + gchar* search_title = g_strdup_printf (_("Search for %s"), title); + gtk_list_store_insert_with_values (store, NULL, matches, + URI_COL, search_uri, TITLE_COL, search_title, YALIGN_COL, 0.25, + STYLE_COL, 1, FAVICON_COL, icon, -1); + g_free (search_uri); + g_free (search_title); + } + matches++; result = sqlite3_step (stmt); } @@ -453,15 +473,13 @@ midori_location_action_popup_timeout_cb (gpointer data) { gchar* uri; gchar* title; - GtkStyle* style; uri = sokoke_search_uri (katze_item_get_uri (item), action->key); title = g_strdup_printf (_("Search with %s"), katze_item_get_name (item)); - style = gtk_widget_get_style (action->treeview); gtk_list_store_insert_with_values (store, NULL, matches + i, URI_COL, uri, TITLE_COL, title, YALIGN_COL, 0.25, BACKGROUND_COL, style ? &style->bg[GTK_STATE_NORMAL] : NULL, - FAVICON_COL, NULL, -1); + STYLE_COL, 1, FAVICON_COL, NULL, -1); g_free (uri); g_free (title); i++; @@ -1018,6 +1036,7 @@ midori_location_entry_render_text_cb (GtkCellLayout* layout, gchar* uri; gchar* title; GdkColor* background; + gboolean style; gchar* desc; gchar* desc_uri; gchar* desc_title; @@ -1030,9 +1049,9 @@ midori_location_entry_render_text_cb (GtkCellLayout* layout, size_t len; gtk_tree_model_get (model, iter, URI_COL, &uri, TITLE_COL, &title, - BACKGROUND_COL, &background, -1); + BACKGROUND_COL, &background, STYLE_COL, &style, -1); - if (background != NULL) /* A search engine action */ + if (style) /* A search engine action */ { g_object_set (renderer, "text", title, "ellipsize-set", TRUE, "ellipsize", PANGO_ELLIPSIZE_END, NULL);