diff options
author | Christian Dywan <christian.dywan@canonical.com> | 2013-12-19 21:00:59 +0000 |
---|---|---|
committer | Tarmac <> | 2013-12-19 21:00:59 +0000 |
commit | 8b546425264a21a4f18d69686eca59a3f1bfc0fc (patch) | |
tree | b9643e9632fc519ef5de92cdd145b15bebb9ba1e | |
parent | d0253458e630c7548b29d024dc34f4152a76a2f1 (diff) | |
parent | d6ac0c16ab04c04d8e88b3eac8e1edf498d9da8d (diff) | |
download | midori-8b546425264a21a4f18d69686eca59a3f1bfc0fc.tar.gz |
Use int64 arguments in HistoryDatabase.query
-rw-r--r-- | midori/midori-browser.c | 78 | ||||
-rw-r--r-- | midori/midori-database.vala | 6 | ||||
-rw-r--r-- | midori/midori-history.c | 32 | ||||
-rw-r--r-- | midori/midori-historydatabase.vala | 26 | ||||
-rw-r--r-- | tests/completion.vala | 47 |
5 files changed, 103 insertions, 86 deletions
diff --git a/midori/midori-browser.c b/midori/midori-browser.c index b354676e..7cccc670 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -90,6 +90,7 @@ struct _MidoriBrowser KatzeArray* trash; KatzeArray* search_engines; KatzeArray* history; + MidoriHistoryDatabase* history_database; MidoriSpeedDial* dial; gboolean show_tabs; @@ -177,10 +178,6 @@ static void midori_bookmarkbar_clear (GtkWidget* toolbar); static void -midori_browser_new_history_item (MidoriBrowser* browser, - KatzeItem* item); - -static void _midori_browser_set_toolbar_style (MidoriBrowser* browser, MidoriToolbarStyle toolbar_style); @@ -748,7 +745,7 @@ midori_browser_step_history (MidoriBrowser* browser, { if (midori_view_get_load_status (view) != MIDORI_LOAD_COMMITTED) return; - if (!browser->history || !browser->maximum_history_age) + if (!browser->history_database || !browser->maximum_history_age) return; KatzeItem* proxy = midori_view_get_proxy_item (view); @@ -759,8 +756,24 @@ midori_browser_step_history (MidoriBrowser* browser, if (katze_item_get_meta_integer (proxy, "history-step") == -1 && !katze_item_get_meta_boolean (proxy, "dont-write-history")) { - midori_browser_new_history_item (browser, proxy); + GError* error = NULL; + time_t now = time (NULL); + katze_item_set_added (proxy, now); + gint64 day = sokoke_time_t_to_julian (&now); + midori_history_database_insert (browser->history_database, + katze_item_get_uri (proxy), + katze_item_get_name (proxy), + katze_item_get_added (proxy), day, &error); + if (error != NULL) + { + g_printerr (_("Failed to insert new history item: %s\n"), error->message); + g_error_free (error); + return; + } katze_item_set_meta_integer (proxy, "history-step", 1); + /* FIXME: No signal for adding/ removing */ + katze_array_add_item (browser->history, proxy); + katze_array_remove_item (browser->history, proxy); } else if (katze_item_get_name (proxy) && katze_item_get_meta_integer (proxy, "history-step") >= 1) @@ -5568,46 +5581,6 @@ midori_browser_realize_cb (GtkStyle* style, } static void -midori_browser_new_history_item (MidoriBrowser* browser, - KatzeItem* item) -{ - time_t now; - gint64 day; - sqlite3* db; - static sqlite3_stmt* stmt = NULL; - - g_return_if_fail (katze_item_get_uri (item) != NULL); - - now = time (NULL); - katze_item_set_added (item, now); - day = sokoke_time_t_to_julian (&now); - - db = g_object_get_data (G_OBJECT (browser->history), "db"); - g_return_if_fail (db != NULL); - if (!stmt) - { - const gchar* sqlcmd; - - sqlcmd = "INSERT INTO history (uri, title, date, day) VALUES (?,?,?,?)"; - sqlite3_prepare_v2 (db, sqlcmd, -1, &stmt, NULL); - } - sqlite3_bind_text (stmt, 1, katze_item_get_uri (item), -1, 0); - sqlite3_bind_text (stmt, 2, katze_item_get_name (item), -1, 0); - sqlite3_bind_int64 (stmt, 3, katze_item_get_added (item)); - sqlite3_bind_int64 (stmt, 4, day); - - if (sqlite3_step (stmt) != SQLITE_DONE) - g_printerr (_("Failed to insert new history item: %s\n"), - sqlite3_errmsg (db)); - sqlite3_reset (stmt); - sqlite3_clear_bindings (stmt); - - /* FIXME: Workaround for the lack of a database interface */ - katze_array_add_item (browser->history, item); - katze_array_remove_item (browser->history, item); -} - -static void midori_browser_set_history (MidoriBrowser* browser, KatzeArray* history) { @@ -5617,10 +5590,20 @@ midori_browser_set_history (MidoriBrowser* browser, if (history) g_object_ref (history); katze_object_assign (browser->history, history); + katze_object_assign (browser->history_database, NULL); if (!history) return; + GError* error = NULL; + browser->history_database = midori_history_database_new (NULL, &error); + if (error != NULL) + { + g_printerr (_("Failed to initialize history: %s"), error->message); + g_printerr ("\n"); + g_error_free (error); + return; + } g_object_set (_action_by_name (browser, "Location"), "history", browser->history, NULL); } @@ -5735,6 +5718,8 @@ midori_browser_init (MidoriBrowser* browser) browser->settings = midori_web_settings_new (); browser->proxy_array = katze_array_new (KATZE_TYPE_ARRAY); browser->bookmarks = NULL; + browser->history = NULL; + browser->history_database = NULL; browser->trash = NULL; browser->search_engines = NULL; browser->dial = NULL; @@ -6122,6 +6107,7 @@ midori_browser_finalize (GObject* object) katze_object_assign (browser->trash, NULL); katze_object_assign (browser->search_engines, NULL); katze_object_assign (browser->history, NULL); + katze_object_assign (browser->history_database, NULL); katze_object_assign (browser->dial, NULL); g_idle_remove_by_data (browser); diff --git a/midori/midori-database.vala b/midori/midori-database.vala index cb586b89..e19fede4 100644 --- a/midori/midori-database.vala +++ b/midori/midori-database.vala @@ -105,8 +105,10 @@ namespace Midori { */ public int64 get_int64 (string name) throws DatabaseError { int index = column_index (name); - if (stmt.column_type (index) != Sqlite.INTEGER) - throw new DatabaseError.TYPE ("Getting '%s' with wrong type in row: %s".printf (name, query)); + int type = stmt.column_type (index); + if (type != Sqlite.INTEGER && type != Sqlite.NULL) + throw new DatabaseError.TYPE ("Getting '%s' with value '%s' of wrong type %d in row: %s".printf ( + name, stmt.column_text (index), type, query)); return stmt.column_int64 (index); } diff --git a/midori/midori-history.c b/midori/midori-history.c index 11c18f07..bb717747 100644 --- a/midori/midori-history.c +++ b/midori/midori-history.c @@ -18,13 +18,16 @@ static void midori_history_clear_cb (KatzeArray* array, sqlite3* db) { - char* errmsg = NULL; - if (sqlite3_exec (db, "DELETE FROM history; DELETE FROM search", - NULL, NULL, &errmsg) != SQLITE_OK) + GError* error = NULL; + MidoriHistoryDatabase* database = midori_history_database_new (NULL, &error); + if (error == NULL) + midori_history_database_clear (database, 0, &error); + if (error != NULL) { - g_printerr (_("Failed to clear history: %s\n"), errmsg); - sqlite3_free (errmsg); + g_printerr (_("Failed to clear history: %s\n"), error->message); + g_error_free (error); } + g_object_unref (database); } KatzeArray* @@ -60,19 +63,16 @@ midori_history_on_quit (KatzeArray* array, MidoriWebSettings* settings) { gint max_history_age = katze_object_get_int (settings, "maximum-history-age"); - sqlite3* db = g_object_get_data (G_OBJECT (array), "db"); - char* errmsg = NULL; - gchar* sqlcmd = g_strdup_printf ( - "DELETE FROM history WHERE " - "(julianday(date('now')) - julianday(date(date,'unixepoch')))" - " >= %d", max_history_age); - if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK) + GError* error = NULL; + MidoriHistoryDatabase* database = midori_history_database_new (NULL, &error); + if (error == NULL) + midori_history_database_clear (database, max_history_age, &error); + if (error != NULL) { /* i18n: Couldn't remove items that are older than n days */ - g_printerr (_("Failed to remove old history items: %s\n"), errmsg); - sqlite3_free (errmsg); + g_printerr (_("Failed to remove old history items: %s\n"), error->message); + g_error_free (error); } - g_free (sqlcmd); - sqlite3_close (db); + g_object_unref (database); } diff --git a/midori/midori-historydatabase.vala b/midori/midori-historydatabase.vala index b4c31095..5f93bee2 100644 --- a/midori/midori-historydatabase.vala +++ b/midori/midori-historydatabase.vala @@ -49,7 +49,7 @@ namespace Midori { } } - public async List<HistoryItem>? query (string sqlcmd, string? filter, int day, int max_items, Cancellable cancellable) { + public async List<HistoryItem>? query (string sqlcmd, string? filter, int64 day, int64 max_items, Cancellable cancellable) { return_val_if_fail (db != null, null); Midori.DatabaseStatement statement; @@ -118,5 +118,29 @@ namespace Midori { """; return yield query (sqlcmd, filter, 0, max_items, cancellable); } + + public bool insert (string uri, string title, int64 date, int64 day) throws DatabaseError { + unowned string sqlcmd = "INSERT INTO history (uri, title, date, day) VALUES (:uri, :title, :date, :day)"; + var statement = prepare (sqlcmd, + ":uri", typeof (string), uri, + ":title", typeof (string), title, + ":date", typeof (int64), date, + ":day", typeof (int64), day); + return statement.exec (); + } + + public bool clear (int64 maximum_age=0) throws DatabaseError { + unowned string sqlcmd = """ + DELETE FROM history WHERE + (julianday(date('now')) - julianday(date(date,'unixepoch'))) + >= :maximum_age; + DELETE FROM search WHERE + (julianday(date('now')) - julianday(date(date,'unixepoch'))) + >= :maximum_age; + """; + var statement = prepare (sqlcmd, + ":maximum_age", typeof (int64), maximum_age); + return statement.exec (); + } } } diff --git a/tests/completion.vala b/tests/completion.vala index 10c3b08b..8abaf4db 100644 --- a/tests/completion.vala +++ b/tests/completion.vala @@ -87,38 +87,43 @@ void completion_autocompleter () { error ("Expected %d but got %d", 3, n); } -struct TestCaseCompletion { - public string prefix; - public string text; - public int expected_count; -} - -const TestCaseCompletion[] completions = { - { "history", "example", 1 } -}; - -async void complete_spec (Midori.Completion completion, TestCaseCompletion spec) { - assert (completion.can_complete (spec.text)); +async void complete_history (Midori.HistoryDatabase history) { + try { + history.insert ("http://example.com", "Ejemplo", 0, 0); + } catch (Error error) { + assert_not_reached (); + } var cancellable = new Cancellable (); - var suggestions = yield completion.complete (spec.text, null, cancellable); - if (spec.expected_count != suggestions.length ()) - error ("%u expected for %s/ %s but got %u", - spec.expected_count, spec.prefix, spec.text, suggestions.length ()); + var results = yield history.list_by_count_with_bookmarks ("example", 1, cancellable); + assert (results.length () == 1); + var first = results.nth_data (0); + assert (first.title == "Ejemplo"); + results = yield history.list_by_count_with_bookmarks ("ejemplo", 1, cancellable); + assert (results.length () == 1); + first = results.nth_data (0); + assert (first.title == "Ejemplo"); + complete_history_done = true; } +bool complete_history_done = false; void completion_history () { + var app = new Midori.App (); + Midori.HistoryDatabase history; try { var bookmarks_database = new Midori.BookmarksDatabase (); assert (bookmarks_database.db != null); + history = new Midori.HistoryDatabase (app); + assert (history.db != null); + history.clear (0); } catch (Midori.DatabaseError error) { assert_not_reached(); } - var completion = new Midori.HistoryCompletion (); - var app = new Midori.App (); - completion.prepare (app); - foreach (var spec in completions) - complete_spec.begin (completion, spec); + Midori.Test.grab_max_timeout (); + var loop = MainContext.default (); + complete_history.begin (history); + do { loop.iteration (true); } while (!complete_history_done); + Midori.Test.release_max_timeout (); } struct TestCaseRender { |