summaryrefslogtreecommitdiff
path: root/midori
diff options
context:
space:
mode:
authorAndré Auzi <aauzi@free.fr>2013-10-27 21:00:42 +0000
committerTarmac <>2013-10-27 21:00:42 +0000
commit64d6bde3d39b500f3c8d28156db1f705eef2bde2 (patch)
treeff10ca37f689b3b39985d2c852b7e39e1c20432e /midori
parent36e6d9953d8e3633d8abbac3f4516f5463a63d4a (diff)
parent37bd82b08847802d989e0e5dca906472ae36a5f9 (diff)
downloadmidori-64d6bde3d39b500f3c8d28156db1f705eef2bde2.tar.gz
Cache bookmark items to avoid their recreation on database reads
Diffstat (limited to 'midori')
-rw-r--r--midori/midori-bookmarks-db.c134
1 files changed, 126 insertions, 8 deletions
diff --git a/midori/midori-bookmarks-db.c b/midori/midori-bookmarks-db.c
index da110277..2d2c6407 100644
--- a/midori/midori-bookmarks-db.c
+++ b/midori/midori-bookmarks-db.c
@@ -39,6 +39,7 @@ struct _MidoriBookmarksDb
KatzeArray parent_instance;
sqlite3* db;
+ GHashTable* all_items;
};
struct _MidoriBookmarksDbClass
@@ -97,6 +98,21 @@ static gboolean
midori_bookmarks_db_remove_item_db (sqlite3* db,
KatzeItem* item);
+static guint
+item_hash (gconstpointer item)
+{
+ gint64 id = katze_item_get_meta_integer (KATZE_ITEM (item), "id");
+ return g_int64_hash (&id);
+}
+
+static gboolean
+item_equal (gconstpointer item_a, gconstpointer item_b)
+{
+ gint64 id_a = katze_item_get_meta_integer (KATZE_ITEM (item_a), "id");
+ gint64 id_b = katze_item_get_meta_integer (KATZE_ITEM (item_b), "id");
+ return (id_a == id_b)? TRUE : FALSE;
+}
+
static void
midori_bookmarks_db_class_init (MidoriBookmarksDbClass* class)
{
@@ -131,9 +147,11 @@ static void
midori_bookmarks_db_init (MidoriBookmarksDb* bookmarks)
{
bookmarks->db = NULL;
+ bookmarks->all_items = g_hash_table_new (item_hash, item_equal);
katze_item_set_meta_integer (KATZE_ITEM (bookmarks), "id", -1);
katze_item_set_name (KATZE_ITEM (bookmarks), _("Bookmarks"));
+ g_hash_table_insert (bookmarks->all_items, bookmarks, bookmarks);
/* g_object_ref (bookmarks); */
}
@@ -147,6 +165,8 @@ midori_bookmarks_db_finalize (GObject* object)
sqlite3_close (bookmarks->db);
}
+ g_hash_table_unref (bookmarks->all_items);
+
G_OBJECT_CLASS (midori_bookmarks_db_parent_class)->finalize (object);
}
@@ -172,7 +192,13 @@ midori_bookmarks_db_get_item_parent (MidoriBookmarksDb* bookmarks,
}
else
{
- parent = NULL;
+ KatzeItem *search = katze_item_new ();
+
+ katze_item_set_meta_integer(search, "id", parentid);
+
+ parent = KATZE_ARRAY (g_hash_table_lookup (bookmarks->all_items, search));
+
+ g_object_unref (search);
}
return parent;
@@ -267,7 +293,7 @@ _midori_bookmarks_db_remove_item (KatzeArray* array,
if (IS_MIDORI_BOOKMARKS_DB (parent))
KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->remove_item (parent, item);
- else
+ else if (KATZE_IS_ARRAY (parent))
katze_array_remove_item (parent, item);
}
@@ -330,6 +356,84 @@ midori_bookmarks_db_signal_update_item (MidoriBookmarksDb* array,
}
/**
+ * midori_bookmarks_db_add_item_recursive:
+ * @item: the removed #KatzeItem
+ * @bookmarks : the main bookmarks array
+ *
+ * Internal function that creates memory records of the added @item.
+ * If @item is a #KatzeArray, the function recursiveley adds records
+ * of all its childs.
+ **/
+static gint
+midori_bookmarks_db_add_item_recursive (MidoriBookmarksDb* bookmarks,
+ KatzeItem* item)
+{
+ GList* list;
+ KatzeArray* array;
+ gint64 id = 0;
+ gint count = 0;
+ gint64 parentid = katze_item_get_meta_integer (item, "parentid");
+
+ id = midori_bookmarks_db_insert_item_db (bookmarks->db, item, parentid);
+ count++;
+
+ g_object_ref (item);
+ g_hash_table_insert (bookmarks->all_items, item, item);
+
+ if (!KATZE_IS_ARRAY (item))
+ return count;
+
+ array = KATZE_ARRAY (item);
+
+ KATZE_ARRAY_FOREACH_ITEM_L (item, array, list)
+ {
+ katze_item_set_meta_integer (item, "parentid", id);
+ count += midori_bookmarks_db_add_item_recursive (bookmarks, item);
+ }
+
+ g_list_free (list);
+ return count;
+}
+
+/**
+ * midori_bookmarks_db_remove_item_recursive:
+ * @item: the removed #KatzeItem
+ * @bookmarks : the main bookmarks array
+ *
+ * Internal function that removes memory records of the removed @item.
+ * If @item is a #KatzeArray, the function recursiveley removes records
+ * of all its childs.
+ **/
+static void
+midori_bookmarks_db_remove_item_recursive (KatzeItem* item,
+ MidoriBookmarksDb* bookmarks)
+{
+ GHashTableIter hash_iter;
+ gpointer found;
+ KatzeArray* array;
+ KatzeItem* child;
+ GList* list;
+
+ if (NULL != (found = g_hash_table_lookup (bookmarks->all_items, item)))
+ {
+ g_hash_table_remove (bookmarks->all_items, found);
+ g_object_unref (found);
+ }
+
+ if (!KATZE_IS_ARRAY (item))
+ return;
+
+ array = KATZE_ARRAY (item);
+
+ KATZE_ARRAY_FOREACH_ITEM_L (child, array, list)
+ {
+ midori_bookmarks_db_remove_item_recursive (child, bookmarks);
+ }
+
+ g_list_free (list);
+}
+
+/**
* midori_bookmarks_db_insert_item_db:
* @db: the #sqlite3
* @item: #KatzeItem the item to insert
@@ -530,8 +634,7 @@ midori_bookmarks_db_add_item (MidoriBookmarksDb* bookmarks, KatzeItem* item)
g_return_if_fail (KATZE_IS_ITEM (item));
g_return_if_fail (NULL == katze_item_get_meta_string (item, "id"));
- midori_bookmarks_db_insert_item_db (bookmarks->db, item,
- katze_item_get_meta_integer (item, "parentid"));
+ midori_bookmarks_db_add_item_recursive (bookmarks, item);
katze_array_add_item (KATZE_ARRAY (bookmarks), item);
}
@@ -575,6 +678,7 @@ midori_bookmarks_db_remove_item (MidoriBookmarksDb* bookmarks, KatzeItem* item)
g_return_if_fail (katze_item_get_meta_string (item, "id"));
g_return_if_fail (0 != katze_item_get_meta_integer (item, "id"));
+ midori_bookmarks_db_remove_item_recursive (item, bookmarks);
midori_bookmarks_db_remove_item_db (bookmarks->db, item);
katze_array_remove_item (KATZE_ARRAY (bookmarks), item);
@@ -670,9 +774,6 @@ midori_bookmarks_db_import_array (MidoriBookmarksDb* bookmarks,
{
katze_item_set_meta_integer (item, "parentid", parentid);
midori_bookmarks_db_add_item (bookmarks, item);
- if (KATZE_IS_ARRAY (item))
- midori_bookmarks_db_import_array (bookmarks, KATZE_ARRAY (item),
- katze_item_get_meta_integer(item, "id"));
}
g_list_free (list);
}
@@ -716,7 +817,16 @@ midori_bookmarks_db_array_from_statement (sqlite3_stmt* stmt,
for (i = 0; i < cols; i++)
katze_item_set_value_from_column (stmt, i, item);
- if (KATZE_ITEM_IS_FOLDER (item))
+ if (NULL != (found = g_hash_table_lookup (bookmarks->all_items, item)))
+ {
+ for (i = 0; i < cols; i++)
+ katze_item_set_value_from_column (stmt, i, found);
+
+ g_object_unref (item);
+
+ item = found;
+ }
+ else if (KATZE_ITEM_IS_FOLDER (item))
{
g_object_unref (item);
@@ -724,6 +834,14 @@ midori_bookmarks_db_array_from_statement (sqlite3_stmt* stmt,
for (i = 0; i < cols; i++)
katze_item_set_value_from_column (stmt, i, item);
+
+ g_object_ref (item);
+ g_hash_table_insert (bookmarks->all_items, item, item);
+ }
+ else
+ {
+ g_object_ref (item);
+ g_hash_table_insert (bookmarks->all_items, item, item);
}
katze_array_add_item (array, item);