diff options
author | André Auzi <aauzi@free.fr> | 2013-10-27 21:00:42 +0000 |
---|---|---|
committer | Tarmac <> | 2013-10-27 21:00:42 +0000 |
commit | 64d6bde3d39b500f3c8d28156db1f705eef2bde2 (patch) | |
tree | ff10ca37f689b3b39985d2c852b7e39e1c20432e /midori | |
parent | 36e6d9953d8e3633d8abbac3f4516f5463a63d4a (diff) | |
parent | 37bd82b08847802d989e0e5dca906472ae36a5f9 (diff) | |
download | midori-64d6bde3d39b500f3c8d28156db1f705eef2bde2.tar.gz |
Cache bookmark items to avoid their recreation on database reads
Diffstat (limited to 'midori')
-rw-r--r-- | midori/midori-bookmarks-db.c | 134 |
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); |