Implement number of days history is saved

Note that this will 'break' any existing history
and all dates will suddenly jump the beginning
of the unix epoch.
This commit is contained in:
Dale Whittaker 2008-10-16 01:31:47 +02:00 committed by Christian Dywan
parent ae14651145
commit 49a4b00b71
7 changed files with 101 additions and 46 deletions

View file

@ -114,11 +114,13 @@ katze_item_class_init (KatzeItemClass* class)
g_object_class_install_property (gobject_class,
PROP_ADDED,
g_param_spec_string (
g_param_spec_int64 (
"added",
"Added",
"When the item was added",
NULL,
G_MININT64,
G_MAXINT64,
0,
flags));
g_object_class_install_property (gobject_class,
@ -152,7 +154,6 @@ katze_item_finalize (GObject* object)
g_free (item->uri);
g_free (item->icon);
g_free (item->token);
g_free (item->added);
G_OBJECT_CLASS (katze_item_parent_class)->finalize (object);
}
@ -183,7 +184,7 @@ katze_item_set_property (GObject* object,
katze_assign (item->token, g_value_dup_string (value));
break;
case PROP_ADDED:
katze_assign (item->added, g_value_dup_string (value));
item->added = g_value_get_int64 (value);
break;
case PROP_VISITS:
item->visits = g_value_get_int (value);
@ -220,7 +221,7 @@ katze_item_get_property (GObject* object,
g_value_set_string (value, item->token);
break;
case PROP_ADDED:
g_value_set_string (value, item->added);
g_value_set_int64 (value, item->added);
break;
case PROP_VISITS:
g_value_set_int (value, item->visits);
@ -419,10 +420,10 @@ katze_item_set_token (KatzeItem* item,
*
* Return value: a timestamp
**/
const gchar*
gint64
katze_item_get_added (KatzeItem* item)
{
g_return_val_if_fail (KATZE_IS_ITEM (item), NULL);
g_return_val_if_fail (KATZE_IS_ITEM (item), 0);
return item->added;
}
@ -436,11 +437,11 @@ katze_item_get_added (KatzeItem* item)
**/
void
katze_item_set_added (KatzeItem* item,
const gchar* added)
gint64 added)
{
g_return_if_fail (KATZE_IS_ITEM (item));
katze_assign (item->added, g_strdup (added));
item->added = added;
g_object_notify (G_OBJECT (item), "added");
}

View file

@ -41,7 +41,7 @@ struct _KatzeItem
gchar* uri;
gchar* icon;
gchar* token;
gchar* added;
gint64 added;
gint visits;
KatzeItem* parent;
@ -93,12 +93,12 @@ void
katze_item_set_token (KatzeItem* item,
const gchar* token);
const gchar*
gint64
katze_item_get_added (KatzeItem* item);
void
katze_item_set_added (KatzeItem* item,
const gchar* added);
gint64 added);
gint
katze_item_get_visits (KatzeItem* item);

View file

@ -656,7 +656,7 @@ gettimestr (void* data,
g_return_val_if_fail (argc == 1, 1);
katze_item_set_added (item, argv[0]);
katze_item_set_added (item, g_ascii_strtoull (argv[0], NULL, 10));
return 0;
}
@ -672,7 +672,7 @@ midori_history_remove_item_cb (KatzeArray* history,
g_return_if_fail (KATZE_IS_ITEM (item));
sqlcmd = g_strdup_printf ("DELETE FROM history WHERE uri = '%s' AND"
" title = '%s' AND date = '%s' AND visits = %d",
" title = '%s' AND date = %ld AND visits = %d",
katze_item_get_uri (item),
katze_item_get_name (item),
katze_item_get_added (item),
@ -734,7 +734,7 @@ midori_history_add_item_cb (KatzeArray* array,
/* New item, set added to the current date/ time */
if (!katze_item_get_added (item))
{
if (!db_exec_callback (db, "SELECT datetime('now')",
if (!db_exec_callback (db, "SELECT date('now')",
gettimestr, item, &error))
{
g_printerr (_("Failed to add history item. %s\n"), error->message);
@ -743,7 +743,7 @@ midori_history_add_item_cb (KatzeArray* array,
}
}
sqlcmd = g_strdup_printf ("INSERT INTO history VALUES"
"('%s', '%s', '%s', %d)",
"('%s', '%s', %" G_GUINT64_FORMAT ", %d)",
katze_item_get_uri (item),
katze_item_get_name (item),
katze_item_get_added (item),
@ -767,10 +767,10 @@ midori_history_add_items (void* data,
KatzeItem* item;
KatzeArray* parent = NULL;
KatzeArray* array = KATZE_ARRAY (data);
gchar* newdate;
gint64 date;
time_t newdate;
gint i, j, n;
gint ncols = 4;
gsize len;
g_return_val_if_fail (KATZE_IS_ARRAY (array), 1);
@ -789,28 +789,24 @@ midori_history_add_items (void* data,
item = katze_item_new ();
katze_item_set_uri (item, argv[i]);
katze_item_set_name (item, argv[i + 1]);
katze_item_set_added (item, argv[i + 2]);
date = g_ascii_strtoull (argv[i + 2], NULL, 10);
katze_item_set_added (item, date);
katze_item_set_visits (item, atoi (argv[i + 3]));
len = (g_strrstr (argv[i + 2], " ") - argv[i + 2]);
newdate = g_strndup (argv[i + 2], len);
n = katze_array_get_length (array);
for (j = 0; j < n; j++)
{
parent = katze_array_get_nth_item (array, j);
if (newdate && g_ascii_strcasecmp
(katze_item_get_added (KATZE_ITEM (parent)), newdate) == 0)
newdate = katze_item_get_added (KATZE_ITEM (parent));
if (sokoke_same_day (&date, &newdate))
break;
}
if (j == n)
{
parent = katze_array_new (KATZE_TYPE_ARRAY);
katze_item_set_added (KATZE_ITEM (parent), newdate);
katze_item_set_added (KATZE_ITEM (parent), date);
katze_array_add_item (array, parent);
}
g_free (newdate);
katze_array_add_item (parent, item);
}
}
@ -832,13 +828,13 @@ midori_history_initialize (KatzeArray* array,
if (!db_exec (db,
"CREATE TABLE IF NOT EXISTS "
"history(uri text, title text, date text, visits integer)",
"history(uri text, title text, date integer, visits integer)",
error))
return NULL;
if (!db_exec_callback (db,
"SELECT uri, title, date, visits FROM history "
"ORDER BY strftime('%s', date) ASC",
"ORDER BY date ASC",
midori_history_add_items,
array,
error))
@ -857,6 +853,29 @@ midori_history_initialize (KatzeArray* array,
}
return db;
}
static void
midori_history_terminate (sqlite3* db,
gint max_history_age)
{
gchar* sqlcmd;
gboolean success = TRUE;
GError* error = NULL;
sqlcmd = g_strdup_printf (
"DELETE FROM history WHERE "
"(julianday(date('now')) - julianday(date(date,'unixepoch')))"
" >= %d", max_history_age);
db_exec (db, sqlcmd, &error);
if (!success)
{
g_printerr (_("Failed to remove old history items. %s\n"), error->message);
g_error_free (error);
return ;
}
g_free (sqlcmd);
db_close (db);
}
#endif
static gchar*
@ -1060,6 +1079,7 @@ main (int argc,
gchar* uri_ready;
#ifdef HAVE_SQLITE
sqlite3* db;
gint max_history_age;
#endif
#if ENABLE_NLS
@ -1364,7 +1384,8 @@ main (int argc,
g_mkdir_with_parents (config_path, 0755);
g_object_unref (history);
#ifdef HAVE_SQLITE
db_close (db);
g_object_get (settings, "maximum-history-age", &max_history_age, NULL);
midori_history_terminate (db, max_history_age);
#endif
config_file = g_build_filename (config_path, "search", NULL);
error = NULL;

View file

@ -2418,6 +2418,8 @@ midori_browser_history_render_text_cb (GtkTreeViewColumn* column,
GtkWidget* treeview)
{
KatzeItem* item;
time_t date;
char sdate[50];
gtk_tree_model_get (model, iter, 0, &item, -1);
@ -2431,7 +2433,11 @@ midori_browser_history_render_text_cb (GtkTreeViewColumn* column,
}
if (KATZE_IS_ARRAY (item))
g_object_set (renderer, "text", katze_item_get_added (item), NULL);
{
date = (time_t)katze_item_get_added (item);
strftime (sdate, sizeof (sdate), "%Y-%m-%d", localtime (&date));
g_object_set (renderer, "text", sdate, NULL);
}
else
g_object_set (renderer, "text", katze_item_get_name (item), NULL);
@ -4062,9 +4068,7 @@ midori_browser_new_history_item (MidoriBrowser* browser,
gint i;
gboolean found;
time_t now;
gchar newdate [70];
gchar *today;
gsize len;
gint64 date;
if (!sokoke_object_get_boolean (browser->settings, "remember-last-visited-pages"))
return;
@ -4073,19 +4077,15 @@ midori_browser_new_history_item (MidoriBrowser* browser,
treemodel = gtk_tree_view_get_model (treeview);
now = time (NULL);
strftime (newdate, sizeof (newdate), "%Y-%m-%d %H:%M:%S", localtime (&now));
katze_item_set_added (item, newdate);
len = (g_strrstr (newdate, " ") - newdate);
today = g_strndup (newdate, len);
katze_item_set_added (item, now);
found = FALSE;
i = 0;
while (gtk_tree_model_iter_nth_child (treemodel, &iter, NULL, i++))
{
gtk_tree_model_get (treemodel, &iter, 0, &parent, -1);
if (g_ascii_strcasecmp (today,
katze_item_get_added (KATZE_ITEM (parent))) == 0)
date = katze_item_get_added (KATZE_ITEM (parent));
if (sokoke_same_day (&now, &date))
{
found = TRUE;
break;
@ -4095,7 +4095,7 @@ midori_browser_new_history_item (MidoriBrowser* browser,
if (!found)
{
parent = katze_array_new (KATZE_TYPE_ARRAY);
katze_item_set_added (KATZE_ITEM (parent), today);
katze_item_set_added (KATZE_ITEM (parent), now);
katze_array_add_item (browser->history, parent);
katze_array_add_item (parent, item);
_tree_store_insert_history_item (GTK_TREE_STORE (treemodel), NULL,
@ -4108,7 +4108,6 @@ midori_browser_new_history_item (MidoriBrowser* browser,
katze_array_add_item (parent, item);
g_object_unref (parent);
}
g_free (today);
}

View file

@ -575,7 +575,7 @@ midori_web_settings_class_init (MidoriWebSettingsClass* class)
_("Maximum history age"),
_("The maximum number of days to save the history for"),
0, G_MAXINT, 30,
G_PARAM_READABLE));
flags));
g_object_class_install_property (gobject_class,
PROP_REMEMBER_LAST_FORM_INPUTS,

View file

@ -648,3 +648,33 @@ sokoke_tree_view_get_selected_iter (GtkTreeView* tree_view,
return TRUE;
return FALSE;
}
/**
* sokoke_same_day:
* @day1: a time_t timestamp value
* @day2: a time_t timestamp value
*
* Compares two timestamps to see if their values are on the
* same day.
*
* Return value: %TRUE if the day of the timestamps match.
**/
gboolean
sokoke_same_day (const time_t* day1,
const time_t* day2)
{
struct tm* tm1;
struct tm* tm2;
gboolean same;
tm2 = localtime (day1);
tm1 = (struct tm*) g_memdup (tm2, sizeof (struct tm));
tm2 = localtime (day2);
same = (tm1->tm_year == tm2->tm_year &&
tm1->tm_mon == tm2->tm_mon &&
tm1->tm_mday == tm2->tm_mday) ? TRUE : FALSE;
g_free (tm1);
return same;
}

View file

@ -139,4 +139,8 @@ sokoke_tree_view_get_selected_iter (GtkTreeView* tree_view,
GtkTreeModel** model,
GtkTreeIter* iter);
gboolean
sokoke_same_day (const time_t* day1,
const time_t* day2);
#endif /* !__SOKOKE_H__ */