summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Dywan <christian.dywan@canonical.com>2013-12-19 21:00:59 +0000
committerTarmac <>2013-12-19 21:00:59 +0000
commit8b546425264a21a4f18d69686eca59a3f1bfc0fc (patch)
treeb9643e9632fc519ef5de92cdd145b15bebb9ba1e
parentd0253458e630c7548b29d024dc34f4152a76a2f1 (diff)
parentd6ac0c16ab04c04d8e88b3eac8e1edf498d9da8d (diff)
downloadmidori-8b546425264a21a4f18d69686eca59a3f1bfc0fc.tar.gz
Use int64 arguments in HistoryDatabase.query
-rw-r--r--midori/midori-browser.c78
-rw-r--r--midori/midori-database.vala6
-rw-r--r--midori/midori-history.c32
-rw-r--r--midori/midori-historydatabase.vala26
-rw-r--r--tests/completion.vala47
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 {