Merge lp:~aauzi/midori/fix-1179200-5 into lp:midori

Proposed by Cris Dywan
Status: Merged
Approved by: Cris Dywan
Approved revision: 6327
Merged at revision: 6406
Proposed branch: lp:~aauzi/midori/fix-1179200-5
Merge into: lp:midori
Diff against target: 1945 lines (+877/-347)
10 files modified
katze/katze-array.c (+29/-48)
katze/katze-array.h (+30/-0)
katze/katze-item.c (+6/-0)
midori/midori-array.c (+11/-1)
midori/midori-bookmarks-db.c (+660/-195)
midori/midori-bookmarks-db.h (+52/-25)
midori/midori-browser.c (+30/-26)
midori/midori-frontend.c (+4/-4)
panels/midori-bookmarks.c (+27/-25)
tests/bookmarks.c (+28/-23)
To merge this branch: bzr merge lp:~aauzi/midori/fix-1179200-5
Reviewer Review Type Date Requested Status
Cris Dywan Approve
Cody Garver (community) Needs Fixing
Review via email: mp+185943@code.launchpad.net

Commit message

Introduces KatzeArray::update-item to handle metadata changes

Description of the change

Fifth step for merge of fix-1179200

Here the midori_bookmarks_db class is derived from KatzeArray.

It provides the API for bookmarks db operations.

It introduces the update-item signal, which is used by the bookmark bar and the bookmarks panel to handle bookmarks metadata changes.

So far, the bookmark item may still be duplicated (created by the HMI or retrieved from the database)

To post a comment you must log in.
Revision history for this message
Cris Dywan (kalikiana) wrote :

There's considerable whitespace-only changes making the patch much larger than it would otherwise be.

Exposing KatzeArray internals without using a "private" is problematic. Any change to the struct affects ABI.

There's a non-trivial #if 0 without documentation.

review: Needs Fixing
Revision history for this message
Cody Garver (codygarver) wrote :

There are also merge artifacts in the diff like line 137

review: Needs Fixing
Revision history for this message
982c80311320c1b (alexander-wilms) wrote :
lp:~aauzi/midori/fix-1179200-5 updated
6325. By André Auzi

fix indentation errors

Revision history for this message
André Auzi (aauzi) wrote :

> There are also merge artifacts in the diff like line 137
I'm puzzled by this issue, I do see the artifacts in the diff here but not in the branch itself when I branch it again on my laptop.

Could it be a bzr/launchpad issue?

Revision history for this message
André Auzi (aauzi) wrote :

> There's considerable whitespace-only changes making the patch much larger than
> it would otherwise be.
>

My apologies for that, I guess I have to polish my emacs c-style for midori.
Anyway, I've tried to fix this.

> Exposing KatzeArray internals without using a "private" is problematic. Any
> change to the struct affects ABI.
>

OK, I'm on it

> There's a non-trivial #if 0 without documentation.

It was to make sure that the comment just underneath was correct and the enclosed function was actually not used.

If it was my code I would just get rid of the unused function.

lp:~aauzi/midori/fix-1179200-5 updated
6326. By André Auzi

make KatzeArray struct content private

6327. By André Auzi

merge lp:midori to fix conficts

Revision history for this message
André Auzi (aauzi) wrote :

> > There are also merge artifacts in the diff like line 137
> I'm puzzled by this issue, I do see the artifacts in the diff here but not in
> the branch itself when I branch it again on my laptop.
>
> Could it be a bzr/launchpad issue?

OK I figured it was merge conflicts indicators.
I fixed it by merging in lp:midori

Revision history for this message
Cris Dywan (kalikiana) wrote :

Thanks!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'katze/katze-array.c'
--- katze/katze-array.c 2012-08-08 23:02:56 +0000
+++ katze/katze-array.c 2013-09-17 19:35:27 +0000
@@ -25,38 +25,14 @@
25 * #KatzeArray is a type aware container for items.25 * #KatzeArray is a type aware container for items.
26 */26 */
2727
28struct _KatzeArray28G_DEFINE_TYPE (KatzeArray, katze_array, KATZE_TYPE_ITEM);
29
30struct _KatzeArrayPrivate
29{31{
30 KatzeItem parent_instance;
31
32 GType type;32 GType type;
33 GList* items;33 GList* items;
34};34};
3535
36struct _KatzeArrayClass
37{
38 KatzeItemClass parent_class;
39
40 /* Signals */
41 void
42 (*add_item) (KatzeArray* array,
43 gpointer item);
44 void
45 (*remove_item) (KatzeArray* array,
46 gpointer item);
47 void
48 (*move_item) (KatzeArray* array,
49 gpointer item,
50 gint index);
51 void
52 (*clear) (KatzeArray* array);
53
54 void
55 (*update) (KatzeArray* array);
56};
57
58G_DEFINE_TYPE (KatzeArray, katze_array, KATZE_TYPE_ITEM);
59
60enum {36enum {
61 ADD_ITEM,37 ADD_ITEM,
62 REMOVE_ITEM,38 REMOVE_ITEM,
@@ -90,7 +66,7 @@
90 if (g_type_is_a (type, KATZE_TYPE_ITEM))66 if (g_type_is_a (type, KATZE_TYPE_ITEM))
91 katze_item_set_parent (item, array);67 katze_item_set_parent (item, array);
9268
93 array->items = g_list_append (array->items, item);69 array->priv->items = g_list_append (array->priv->items, item);
94 _katze_array_update (array);70 _katze_array_update (array);
95}71}
9672
@@ -98,7 +74,7 @@
98_katze_array_remove_item (KatzeArray* array,74_katze_array_remove_item (KatzeArray* array,
99 gpointer item)75 gpointer item)
100{76{
101 array->items = g_list_remove (array->items, item);77 array->priv->items = g_list_remove (array->priv->items, item);
10278
103 if (KATZE_IS_ITEM (item))79 if (KATZE_IS_ITEM (item))
104 katze_item_set_parent (item, NULL);80 katze_item_set_parent (item, NULL);
@@ -111,8 +87,8 @@
111 gpointer item,87 gpointer item,
112 gint position)88 gint position)
113{89{
114 array->items = g_list_remove (array->items, item);90 array->priv->items = g_list_remove (array->priv->items, item);
115 array->items = g_list_insert (array->items, item, position);91 array->priv->items = g_list_insert (array->priv->items, item, position);
116 _katze_array_update (array);92 _katze_array_update (array);
117}93}
11894
@@ -121,10 +97,10 @@
121{97{
122 GObject* item;98 GObject* item;
12399
124 while ((item = g_list_nth_data (array->items, 0)))100 while ((item = g_list_nth_data (array->priv->items, 0)))
125 g_signal_emit (array, signals[REMOVE_ITEM], 0, item);101 g_signal_emit (array, signals[REMOVE_ITEM], 0, item);
126 g_list_free (array->items);102 g_list_free (array->priv->items);
127 array->items = NULL;103 array->priv->items = NULL;
128 _katze_array_update (array);104 _katze_array_update (array);
129}105}
130106
@@ -217,13 +193,18 @@
217 class->move_item = _katze_array_move_item;193 class->move_item = _katze_array_move_item;
218 class->clear = _katze_array_clear;194 class->clear = _katze_array_clear;
219 class->update = _katze_array_update;195 class->update = _katze_array_update;
196
197 g_type_class_add_private (class, sizeof (KatzeArrayPrivate));
220}198}
221199
222static void200static void
223katze_array_init (KatzeArray* array)201katze_array_init (KatzeArray* array)
224{202{
225 array->type = G_TYPE_OBJECT;203 array->priv = G_TYPE_INSTANCE_GET_PRIVATE (array,
226 array->items = NULL;204 KATZE_TYPE_ARRAY, KatzeArrayPrivate);
205
206 array->priv->type = G_TYPE_OBJECT;
207 array->priv->items = NULL;
227}208}
228209
229static void210static void
@@ -232,9 +213,9 @@
232 KatzeArray* array = KATZE_ARRAY (object);213 KatzeArray* array = KATZE_ARRAY (object);
233 GList* items;214 GList* items;
234215
235 for (items = array->items; items; items = g_list_next (items))216 for (items = array->priv->items; items; items = g_list_next (items))
236 g_object_unref (items->data);217 g_object_unref (items->data);
237 g_list_free (array->items);218 g_list_free (array->priv->items);
238219
239 G_OBJECT_CLASS (katze_array_parent_class)->finalize (object);220 G_OBJECT_CLASS (katze_array_parent_class)->finalize (object);
240}221}
@@ -258,7 +239,7 @@
258 g_return_val_if_fail (g_type_is_a (type, G_TYPE_OBJECT), NULL);239 g_return_val_if_fail (g_type_is_a (type, G_TYPE_OBJECT), NULL);
259240
260 array = g_object_new (KATZE_TYPE_ARRAY, NULL);241 array = g_object_new (KATZE_TYPE_ARRAY, NULL);
261 array->type = type;242 array->priv->type = type;
262243
263 return array;244 return array;
264}245}
@@ -279,7 +260,7 @@
279{260{
280 g_return_val_if_fail (KATZE_IS_ARRAY (array), FALSE);261 g_return_val_if_fail (KATZE_IS_ARRAY (array), FALSE);
281262
282 return g_type_is_a (array->type, is_a_type);263 return g_type_is_a (array->priv->type, is_a_type);
283}264}
284265
285/**266/**
@@ -333,7 +314,7 @@
333{314{
334 g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL);315 g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL);
335316
336 return g_list_nth_data (array->items, n);317 return g_list_nth_data (array->priv->items, n);
337}318}
338319
339/**320/**
@@ -349,7 +330,7 @@
349{330{
350 g_return_val_if_fail (KATZE_IS_ARRAY (array), TRUE);331 g_return_val_if_fail (KATZE_IS_ARRAY (array), TRUE);
351332
352 return !g_list_nth_data (array->items, 0);333 return !g_list_nth_data (array->priv->items, 0);
353}334}
354335
355/**336/**
@@ -367,7 +348,7 @@
367{348{
368 g_return_val_if_fail (KATZE_IS_ARRAY (array), -1);349 g_return_val_if_fail (KATZE_IS_ARRAY (array), -1);
369350
370 return g_list_index (array->items, item);351 return g_list_index (array->priv->items, item);
371}352}
372353
373/**354/**
@@ -401,7 +382,7 @@
401 if (token_length < 1)382 if (token_length < 1)
402 token_length = strlen (token);383 token_length = strlen (token);
403384
404 for (items = array->items; items; items = g_list_next (items))385 for (items = array->priv->items; items; items = g_list_next (items))
405 {386 {
406 const gchar* found_token = ((KatzeItem*)items->data)->token;387 const gchar* found_token = ((KatzeItem*)items->data)->token;
407 if (found_token != NULL)388 if (found_token != NULL)
@@ -439,7 +420,7 @@
439 g_return_val_if_fail (katze_array_is_a (array, KATZE_TYPE_ITEM), NULL);420 g_return_val_if_fail (katze_array_is_a (array, KATZE_TYPE_ITEM), NULL);
440 g_return_val_if_fail (uri != NULL, NULL);421 g_return_val_if_fail (uri != NULL, NULL);
441422
442 for (items = array->items; items; items = g_list_next (items))423 for (items = array->priv->items; items; items = g_list_next (items))
443 {424 {
444 const gchar* found_uri = ((KatzeItem*)items->data)->uri;425 const gchar* found_uri = ((KatzeItem*)items->data)->uri;
445 if (found_uri != NULL && !strcmp (found_uri, uri))426 if (found_uri != NULL && !strcmp (found_uri, uri))
@@ -461,7 +442,7 @@
461{442{
462 g_return_val_if_fail (KATZE_IS_ARRAY (array), 0);443 g_return_val_if_fail (KATZE_IS_ARRAY (array), 0);
463444
464 return g_list_length (array->items);445 return g_list_length (array->priv->items);
465}446}
466447
467/**448/**
@@ -499,7 +480,7 @@
499{480{
500 g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL);481 g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL);
501482
502 return g_list_copy (array->items);483 return g_list_copy (array->priv->items);
503}484}
504485
505GList*486GList*
@@ -507,7 +488,7 @@
507{488{
508 g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL);489 g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL);
509490
510 return array->items;491 return array->priv->items;
511}492}
512493
513/**494/**
514495
=== modified file 'katze/katze-array.h'
--- katze/katze-array.h 2011-01-19 20:58:26 +0000
+++ katze/katze-array.h 2013-09-17 19:35:27 +0000
@@ -31,6 +31,36 @@
3131
32typedef struct _KatzeArray KatzeArray;32typedef struct _KatzeArray KatzeArray;
33typedef struct _KatzeArrayClass KatzeArrayClass;33typedef struct _KatzeArrayClass KatzeArrayClass;
34typedef struct _KatzeArrayPrivate KatzeArrayPrivate;
35
36struct _KatzeArray
37{
38 KatzeItem parent_instance;
39
40 KatzeArrayPrivate* priv;
41};
42
43struct _KatzeArrayClass
44{
45 KatzeItemClass parent_class;
46
47 /* Signals */
48 void
49 (*add_item) (KatzeArray* array,
50 gpointer item);
51 void
52 (*remove_item) (KatzeArray* array,
53 gpointer item);
54 void
55 (*move_item) (KatzeArray* array,
56 gpointer item,
57 gint index);
58 void
59 (*clear) (KatzeArray* array);
60
61 void
62 (*update) (KatzeArray* array);
63};
3464
35GType65GType
36katze_array_get_type (void) G_GNUC_CONST;66katze_array_get_type (void) G_GNUC_CONST;
3767
=== modified file 'katze/katze-item.c'
--- katze/katze-item.c 2013-07-27 12:35:55 +0000
+++ katze/katze-item.c 2013-09-17 19:35:27 +0000
@@ -314,6 +314,9 @@
314{314{
315 g_return_if_fail (KATZE_IS_ITEM (item));315 g_return_if_fail (KATZE_IS_ITEM (item));
316316
317 if (!g_strcmp0 (item->name, name))
318 return;
319
317 katze_assign (item->name, g_strdup (name));320 katze_assign (item->name, g_strdup (name));
318 if (item->parent)321 if (item->parent)
319 katze_array_update ((KatzeArray*)item->parent);322 katze_array_update ((KatzeArray*)item->parent);
@@ -418,6 +421,9 @@
418{421{
419 g_return_if_fail (KATZE_IS_ITEM (item));422 g_return_if_fail (KATZE_IS_ITEM (item));
420423
424 if (!g_strcmp0 (katze_item_get_meta_string (item, "icon"), icon))
425 return;
426
421 katze_item_set_meta_string (item, "icon", icon);427 katze_item_set_meta_string (item, "icon", icon);
422 if (item->parent)428 if (item->parent)
423 katze_array_update ((KatzeArray*)item->parent);429 katze_array_update ((KatzeArray*)item->parent);
424430
=== modified file 'midori/midori-array.c'
--- midori/midori-array.c 2013-08-05 12:50:34 +0000
+++ midori/midori-array.c 2013-09-17 19:35:27 +0000
@@ -986,7 +986,17 @@
986 return FALSE;986 return FALSE;
987}987}
988988
989static void989/**
990 * katze_item_set_value_from_columne:
991 * @stmt: prepared statement
992 * @column: column to read
993 * @item: #KatzeItem to populate
994 *
995 * Stores the column in the given #KatzeItem.
996 *
997 * Since: 0.2.7
998 **/
999void
990katze_item_set_value_from_column (sqlite3_stmt* stmt,1000katze_item_set_value_from_column (sqlite3_stmt* stmt,
991 gint column,1001 gint column,
992 KatzeItem* item)1002 KatzeItem* item)
9931003
=== modified file 'midori/midori-bookmarks-db.c'
--- midori/midori-bookmarks-db.c 2013-09-08 10:53:32 +0000
+++ midori/midori-bookmarks-db.c 2013-09-17 19:35:27 +0000
@@ -25,14 +25,324 @@
25 #include <unistd.h>25 #include <unistd.h>
26#endif26#endif
2727
28static gboolean28/**
29midori_bookmarks_update_item_db (sqlite3* db,29 * SECTION:midory-bookmarks-db
30 KatzeItem* item);30 * @short_description: A #KatzeArray connected to a database
3131 * @see_also: #KatzeArray
32gint6432 *
33midori_bookmarks_insert_item_db (sqlite3* db,33 * #MidoriBookmarksDb is a #KatzeArray specialized for database
34 KatzeItem* item,34 * interraction.
35 gint64 parentid)35 */
36
37struct _MidoriBookmarksDb
38{
39 KatzeArray parent_instance;
40
41 sqlite3* db;
42};
43
44struct _MidoriBookmarksDbClass
45{
46 KatzeArrayClass parent_class;
47
48 /* Signals */
49 void
50 (*update_item) (MidoriBookmarksDb* bookmarks,
51 gpointer item);
52};
53
54G_DEFINE_TYPE (MidoriBookmarksDb, midori_bookmarks_db, KATZE_TYPE_ARRAY);
55
56enum {
57 UPDATE_ITEM,
58
59 LAST_SIGNAL
60};
61
62static guint signals[LAST_SIGNAL];
63
64static void
65_midori_bookmarks_db_add_item (KatzeArray* array,
66 gpointer item);
67
68static void
69_midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks,
70 gpointer item);
71
72static void
73_midori_bookmarks_db_remove_item (KatzeArray* array,
74 gpointer item);
75
76static void
77_midori_bookmarks_db_move_item (KatzeArray* array,
78 gpointer item,
79 gint position);
80
81static void
82_midori_bookmarks_db_clear (KatzeArray* array);
83
84static void
85midori_bookmarks_db_finalize (GObject* object);
86
87static gint64
88midori_bookmarks_db_insert_item_db (sqlite3* db,
89 KatzeItem* item,
90 gint64 parentid);
91
92static gboolean
93midori_bookmarks_db_update_item_db (sqlite3* db,
94 KatzeItem* item);
95
96static gboolean
97midori_bookmarks_db_remove_item_db (sqlite3* db,
98 KatzeItem* item);
99
100static void
101midori_bookmarks_db_class_init (MidoriBookmarksDbClass* class)
102{
103 GObjectClass* gobject_class;
104 KatzeArrayClass* katze_array_class;
105
106 gobject_class = G_OBJECT_CLASS (class);
107 gobject_class->finalize = midori_bookmarks_db_finalize;
108
109 signals[UPDATE_ITEM] = g_signal_new (
110 "update-item",
111 G_TYPE_FROM_CLASS (class),
112 (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION),
113 G_STRUCT_OFFSET (MidoriBookmarksDbClass, update_item),
114 0,
115 NULL,
116 g_cclosure_marshal_VOID__POINTER,
117 G_TYPE_NONE, 1,
118 G_TYPE_POINTER);
119
120 katze_array_class = KATZE_ARRAY_CLASS (class);
121
122 katze_array_class->add_item = _midori_bookmarks_db_add_item;
123 katze_array_class->remove_item = _midori_bookmarks_db_remove_item;
124 katze_array_class->move_item = _midori_bookmarks_db_move_item;
125 katze_array_class->clear = _midori_bookmarks_db_clear;
126
127 class->update_item = _midori_bookmarks_db_update_item;
128}
129
130static void
131midori_bookmarks_db_init (MidoriBookmarksDb* bookmarks)
132{
133 bookmarks->db = NULL;
134
135 katze_item_set_meta_integer (KATZE_ITEM (bookmarks), "id", 0);
136 katze_item_set_name (KATZE_ITEM (bookmarks), _("Bookmarks"));
137 /* g_object_ref (bookmarks); */
138}
139
140static void
141midori_bookmarks_db_finalize (GObject* object)
142{
143 MidoriBookmarksDb* bookmarks = MIDORI_BOOKMARKS_DB (object);
144
145 if (bookmarks->db)
146 {
147 sqlite3_close (bookmarks->db);
148 }
149
150 G_OBJECT_CLASS (midori_bookmarks_db_parent_class)->finalize (object);
151}
152
153/**
154 * midori_bookmarks_db_get_item_parent:
155 * @bookmarks: the main bookmarks array
156 * @item: a #KatzeItem
157 *
158 * Internal function that find the parent of the @item thanks to its %parentid
159 **/
160static KatzeArray*
161midori_bookmarks_db_get_item_parent (MidoriBookmarksDb* bookmarks,
162 gpointer item)
163{
164 KatzeArray* parent;
165 gint64 parentid;
166
167 parentid = katze_item_get_meta_integer (KATZE_ITEM (item), "parentid");
168
169 if (parentid == 0)
170 {
171 parent = KATZE_ARRAY (bookmarks);
172 }
173 else
174 {
175 parent = NULL;
176 }
177
178 return parent;
179}
180
181/**
182 * _midori_bookmarks_db_add_item:
183 * @array: the main bookmarks array
184 * @item: a #KatzeItem
185 *
186 * Internal function that overloads the #KatzeArray %katze_array_add_item().
187 * It relays the add item to the appropriate #KatzeArray.
188 **/
189static void
190_midori_bookmarks_db_add_item (KatzeArray* array,
191 gpointer item)
192{
193 MidoriBookmarksDb *bookmarks;
194 KatzeArray* parent;
195 KatzeArray* db_parent;
196
197 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array));
198 g_return_if_fail (KATZE_IS_ITEM (item));
199
200 bookmarks = MIDORI_BOOKMARKS_DB (array);
201
202 parent = katze_item_get_parent (KATZE_ITEM (item));
203
204 db_parent = midori_bookmarks_db_get_item_parent (bookmarks, item);
205
206 g_return_if_fail (db_parent);
207
208 if (parent == db_parent)
209 {
210 if (IS_MIDORI_BOOKMARKS_DB (parent))
211 KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->update (parent);
212 else
213 katze_array_update (parent);
214 return;
215 }
216
217 if (IS_MIDORI_BOOKMARKS_DB (parent))
218 KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->add_item (parent, item);
219 else
220 katze_array_add_item (parent, item);
221}
222
223/**
224 * _midori_bookmarks_db_update_item:
225 * @array: the main bookmarks array
226 * @item: a #KatzeItem
227 *
228 * Internal function that implements the %midori_bookmarks_db_update_item() post-processing.
229 * It relays an update to the appropriate #KatzeArray.
230 **/
231static void
232_midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks,
233 gpointer item)
234{
235 KatzeArray* parent;
236
237 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks));
238 g_return_if_fail (KATZE_IS_ITEM (item));
239
240 parent = katze_item_get_parent (KATZE_ITEM (item));
241
242 g_return_if_fail (parent);
243
244 katze_array_update (parent);
245}
246
247/**
248 * _midori_bookmarks_db_remove_item:
249 * @array: the main bookmarks array
250 * @item: a #KatzeItem
251 *
252 * Internal function that overloads the #KatzeArray %katze_array_remove_item().
253 * It relays the remove item to the appropriate #KatzeArray.
254 **/
255static void
256_midori_bookmarks_db_remove_item (KatzeArray* array,
257 gpointer item)
258{
259 KatzeArray* parent;
260
261 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array));
262 g_return_if_fail (KATZE_IS_ITEM (item));
263
264 parent = katze_item_get_parent (KATZE_ITEM (item));
265
266 g_return_if_fail (parent);
267
268 if (IS_MIDORI_BOOKMARKS_DB (parent))
269 KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->remove_item (parent, item);
270 else
271 katze_array_remove_item (parent, item);
272}
273
274/**
275 * _midori_bookmarks_db_move_item:
276 * @array: the main bookmarks array
277 * @item: a #KatzeItem
278 * @position: the new @item position
279 *
280 * Internal function that overloads the #KatzeArray %katze_array_move_item().
281 * It relays the move @item to the appropriate #KatzeArray.
282 **/
283static void
284_midori_bookmarks_db_move_item (KatzeArray* array,
285 gpointer item,
286 gint position)
287{
288 MidoriBookmarksDb *bookmarks;
289 KatzeArray* parent;
290
291 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array));
292 g_return_if_fail (KATZE_IS_ITEM (item));
293
294 parent = katze_item_get_parent (KATZE_ITEM (item));
295
296 g_return_if_fail (parent);
297
298 KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->move_item (parent, item, position);
299}
300
301/**
302 * _midori_bookmarks_db_clear:
303 * @array: the main bookmarks array
304 *
305 * Internal function that overloads the #KatzeArray %katze_array_clear().
306 * It deletes the whole bookmarks data.
307 **/
308static void
309_midori_bookmarks_db_clear (KatzeArray* array)
310{
311 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array));
312
313 g_critical ("_midori_bookmarks_db_clear: not implemented\n");
314}
315
316/**
317 * midori_bookmarks_db_signal_update_item:
318 * @array: a #KatzeArray
319 * @item: an item
320 *
321 * Notify an update of the item of the array.
322 *
323 **/
324static void
325midori_bookmarks_db_signal_update_item (MidoriBookmarksDb* array,
326 gpointer item)
327{
328 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array));
329
330 g_signal_emit (array, signals[UPDATE_ITEM], 0, item);
331}
332
333/**
334 * midori_bookmarks_db_insert_item_db:
335 * @db: the #sqlite3
336 * @item: #KatzeItem the item to insert
337 *
338 * Internal function that does the actual SQL INSERT of the @item in @db.
339 *
340 * Since: 0.5.2
341 **/
342static gint64
343midori_bookmarks_db_insert_item_db (sqlite3* db,
344 KatzeItem* item,
345 gint64 parentid)
36{346{
37 gchar* sqlcmd;347 gchar* sqlcmd;
38 char* errmsg = NULL;348 char* errmsg = NULL;
@@ -70,15 +380,15 @@
70 new_parentid = g_strdup_printf ("NULL");380 new_parentid = g_strdup_printf ("NULL");
71381
72 sqlcmd = sqlite3_mprintf (382 sqlcmd = sqlite3_mprintf (
73 "INSERT INTO bookmarks (id, parentid, title, uri, desc, toolbar, app) "383 "INSERT INTO bookmarks (id, parentid, title, uri, desc, toolbar, app) "
74 "VALUES (%q, %q, '%q', '%q', '%q', %d, %d)",384 "VALUES (%q, %q, '%q', '%q', '%q', %d, %d)",
75 id,385 id,
76 new_parentid,386 new_parentid,
77 katze_item_get_name (item),387 katze_item_get_name (item),
78 katze_str_non_null (uri),388 katze_str_non_null (uri),
79 katze_str_non_null (desc),389 katze_str_non_null (desc),
80 katze_item_get_meta_boolean (item, "toolbar"),390 katze_item_get_meta_boolean (item, "toolbar"),
81 katze_item_get_meta_boolean (item, "app"));391 katze_item_get_meta_boolean (item, "app"));
82392
83 if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) == SQLITE_OK)393 if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) == SQLITE_OK)
84 {394 {
@@ -89,7 +399,7 @@
89399
90 sqlite3_free (sqlcmd);400 sqlite3_free (sqlcmd);
91 sqlcmd = sqlite3_mprintf (401 sqlcmd = sqlite3_mprintf (
92 "SELECT seq FROM sqlite_sequence WHERE name = 'bookmarks'");402 "SELECT seq FROM sqlite_sequence WHERE name = 'bookmarks'");
93403
94 seq_array = katze_array_from_sqlite (db, sqlcmd);404 seq_array = katze_array_from_sqlite (db, sqlcmd);
95 if (katze_array_get_nth_item (seq_array, 0))405 if (katze_array_get_nth_item (seq_array, 0))
@@ -115,8 +425,17 @@
115 return seq;425 return seq;
116}426}
117427
118gboolean428/**
119midori_bookmarks_update_item_db (sqlite3* db,429 * midori_bookmarks_db_update_item_db:
430 * @db: the #sqlite3
431 * @item: #KatzeItem the item to update
432 *
433 * Internal function that does the actual SQL UPDATE of the @item in @db.
434 *
435 * Since: 0.5.2
436 **/
437static gboolean
438midori_bookmarks_db_update_item_db (sqlite3* db,
120 KatzeItem* item)439 KatzeItem* item)
121{440{
122 gchar* sqlcmd;441 gchar* sqlcmd;
@@ -126,7 +445,7 @@
126 gchar* id;445 gchar* id;
127446
128 id = g_strdup_printf ("%" G_GINT64_FORMAT,447 id = g_strdup_printf ("%" G_GINT64_FORMAT,
129 katze_item_get_meta_integer (item, "id"));448 katze_item_get_meta_integer (item, "id"));
130449
131 if (katze_item_get_meta_integer (item, "parentid") > 0)450 if (katze_item_get_meta_integer (item, "parentid") > 0)
132 parentid = g_strdup_printf ("%" G_GINT64_FORMAT,451 parentid = g_strdup_printf ("%" G_GINT64_FORMAT,
@@ -135,16 +454,16 @@
135 parentid = g_strdup_printf ("NULL");454 parentid = g_strdup_printf ("NULL");
136455
137 sqlcmd = sqlite3_mprintf (456 sqlcmd = sqlite3_mprintf (
138 "UPDATE bookmarks SET "457 "UPDATE bookmarks SET "
139 "parentid=%q, title='%q', uri='%q', desc='%q', toolbar=%d, app=%d "458 "parentid=%q, title='%q', uri='%q', desc='%q', toolbar=%d, app=%d "
140 "WHERE id = %q ;",459 "WHERE id = %q ;",
141 parentid,460 parentid,
142 katze_item_get_name (item),461 katze_item_get_name (item),
143 katze_str_non_null (katze_item_get_uri (item)),462 katze_str_non_null (katze_item_get_uri (item)),
144 katze_str_non_null (katze_item_get_meta_string (item, "desc")),463 katze_str_non_null (katze_item_get_meta_string (item, "desc")),
145 katze_item_get_meta_boolean (item, "toolbar"),464 katze_item_get_meta_boolean (item, "toolbar"),
146 katze_item_get_meta_boolean (item, "app"),465 katze_item_get_meta_boolean (item, "app"),
147 id);466 id);
148467
149 updated = TRUE;468 updated = TRUE;
150 if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)469 if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
@@ -162,68 +481,104 @@
162}481}
163482
164/**483/**
484 * midori_bookmarks_db_remove_item_db:
485 * @db: the #sqlite3
486 * @item: #KatzeItem the item to delete
487 *
488 * Internal function that does the actual SQL DELETE of the @item in @db.
489 *
490 * Since: 0.5.2
491 **/
492static gboolean
493midori_bookmarks_db_remove_item_db (sqlite3* db,
494 KatzeItem* item)
495{
496 char* errmsg = NULL;
497 gchar* sqlcmd;
498 gboolean removed = TRUE;
499 gchar* id;
500
501 id = g_strdup_printf ("%" G_GINT64_FORMAT,
502 katze_item_get_meta_integer (item, "id"));
503
504 sqlcmd = sqlite3_mprintf ("DELETE FROM bookmarks WHERE id = %q", id);
505
506 if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
507 {
508 g_printerr (_("Failed to remove bookmark item: %s\n"), errmsg);
509 sqlite3_free (errmsg);
510 removed = FALSE;
511 }
512
513 sqlite3_free (sqlcmd);
514 g_free (id);
515 return removed;
516}
517
518/**
519 * midori_bookmarks_db_add_item:
520 * @bookmarks: the main bookmark array
521 * @item: #KatzeItem the item to update
522 *
523 * Adds the @item in the bookmark data base.
524 *
525 * Since: 0.5.2
526 **/
527void
528midori_bookmarks_db_add_item (MidoriBookmarksDb* bookmarks, KatzeItem* item)
529{
530 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks));
531 g_return_if_fail (KATZE_IS_ITEM (item));
532 g_return_if_fail (NULL == katze_item_get_meta_string (item, "id"));
533
534 midori_bookmarks_db_insert_item_db (bookmarks->db, item,
535 katze_item_get_meta_integer (item, "parentid"));
536
537 katze_array_add_item (KATZE_ARRAY (bookmarks), item);
538}
539
540/**
165 * midori_bookmarks_db_update_item:541 * midori_bookmarks_db_update_item:
166 * @bookmarks: the main bookmark array542 * @bookmarks: the main bookmark array
167 * @item: #KatzeItem the item to update543 * @item: #KatzeItem the item to update
168 *544 *
169 * Updates the @item in the bookmark data base.545 * Updates the @item in the bookmark data base.
170 *546 *
171 * Since: 0.5.5547 * Since: 0.5.2
172 **/548 **/
173void549void
174midori_array_update_item (KatzeArray* bookmarks,550midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, KatzeItem* item)
175 KatzeItem* item)551{
176{552 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks));
177 g_return_if_fail (KATZE_IS_ARRAY (bookmarks));553 g_return_if_fail (KATZE_IS_ITEM (item));
178 g_return_if_fail (KATZE_IS_ITEM (item));554 g_return_if_fail (katze_item_get_meta_string (item, "id"));
179 g_return_if_fail (katze_item_get_meta_string (item, "id"));555 g_return_if_fail (0 != katze_item_get_meta_integer (item, "id"));
180 g_return_if_fail (0 != katze_item_get_meta_integer (item, "id"));556
181557 midori_bookmarks_db_update_item_db (bookmarks->db, item);
182 sqlite3* db = g_object_get_data (G_OBJECT (bookmarks), "db");558
183559 midori_bookmarks_db_signal_update_item (bookmarks, item);
184 g_return_if_fail (db);560}
185561
186 midori_bookmarks_update_item_db (db, item);562/**
187}563 * midori_bookmarks_db_remove_item:
188564 * @bookmarks: the main bookmark array
189void565 * @item: #KatzeItem the item to remove
190midori_bookmarks_dbtracer (void* dummy,566 *
191 const char* query)567 * Removes the @item from the bookmark data base.
192{568 *
193 g_printerr ("%s\n", query);569 * Since: 0.5.2
194}570 **/
195571void
196static void572midori_bookmarks_db_remove_item (MidoriBookmarksDb* bookmarks, KatzeItem* item)
197midori_bookmarks_add_item_cb (KatzeArray* array,573{
198 KatzeItem* item,574 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks));
199 sqlite3* db)575 g_return_if_fail (KATZE_IS_ITEM (item));
200{576 g_return_if_fail (katze_item_get_meta_string (item, "id"));
201 midori_bookmarks_insert_item_db (db, item,577 g_return_if_fail (0 != katze_item_get_meta_integer (item, "id"));
202 katze_item_get_meta_integer (item, "parentid"));578
203}579 midori_bookmarks_db_remove_item_db (bookmarks->db, item);
204580
205static void581 katze_array_remove_item (KATZE_ARRAY (bookmarks), item);
206midori_bookmarks_remove_item_cb (KatzeArray* array,
207 KatzeItem* item,
208 sqlite3* db)
209{
210 gchar* sqlcmd;
211 char* errmsg = NULL;
212 gchar* id;
213
214 id = g_strdup_printf ("%" G_GINT64_FORMAT,
215 katze_item_get_meta_integer (item, "id"));
216
217 sqlcmd = sqlite3_mprintf ("DELETE FROM bookmarks WHERE id = %q", id);
218
219 if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK)
220 {
221 g_printerr (_("Failed to remove bookmark item: %s\n"), errmsg);
222 sqlite3_free (errmsg);
223 }
224
225 sqlite3_free (sqlcmd);
226 g_free (id);
227}582}
228583
229#define _APPEND_TO_SQL_ERRORMSG(custom_errmsg) \584#define _APPEND_TO_SQL_ERRORMSG(custom_errmsg) \
@@ -237,8 +592,8 @@
237 g_string_append (errmsg_str, custom_errmsg); \592 g_string_append (errmsg_str, custom_errmsg); \
238 } while (0)593 } while (0)
239594
240gboolean595static gboolean
241midori_bookmarks_import_from_old_db (sqlite3* db,596midori_bookmarks_db_import_from_old_db (sqlite3* db,
242 const gchar* oldfile,597 const gchar* oldfile,
243 gchar** errmsg)598 gchar** errmsg)
244{599{
@@ -293,8 +648,24 @@
293}648}
294#undef _APPEND_TO_SQL_ERRORMSG649#undef _APPEND_TO_SQL_ERRORMSG
295650
296KatzeArray*651static void
297midori_bookmarks_new (char** errmsg)652midori_bookmarks_db_dbtracer (void* dummy,
653 const char* query)
654{
655 g_printerr ("%s\n", query);
656}
657
658/**
659 * midori_bookmarks_db_new:
660 *
661 * Initializes the bookmark data base.
662 *
663 * Returns: the main bookmarks array
664 *
665 * Since: 0.5.2
666 **/
667MidoriBookmarksDb*
668midori_bookmarks_db_new (char** errmsg)
298{669{
299 sqlite3* db;670 sqlite3* db;
300 gchar* oldfile;671 gchar* oldfile;
@@ -304,6 +675,7 @@
304 gchar* sql_errmsg = NULL;675 gchar* sql_errmsg = NULL;
305 gchar* import_errmsg = NULL;676 gchar* import_errmsg = NULL;
306 KatzeArray* array;677 KatzeArray* array;
678 MidoriBookmarksDb* bookmarks;
307679
308 g_return_val_if_fail (errmsg != NULL, NULL);680 g_return_val_if_fail (errmsg != NULL, NULL);
309681
@@ -321,7 +693,7 @@
321 }693 }
322694
323 if (midori_debug ("bookmarks"))695 if (midori_debug ("bookmarks"))
324 sqlite3_trace (db, midori_bookmarks_dbtracer, NULL);696 sqlite3_trace (db, midori_bookmarks_db_dbtracer, NULL);
325697
326 create_stmt = /* Table structure */698 create_stmt = /* Table structure */
327 "CREATE TABLE IF NOT EXISTS bookmarks "699 "CREATE TABLE IF NOT EXISTS bookmarks "
@@ -442,7 +814,7 @@
442814
443 if (oldfile_exists)815 if (oldfile_exists)
444 /* import from old db */816 /* import from old db */
445 if (!midori_bookmarks_import_from_old_db (db, oldfile, &import_errmsg))817 if (!midori_bookmarks_db_import_from_old_db (db, oldfile, &import_errmsg))
446 {818 {
447 *errmsg = g_strdup_printf (_("Couldn't import from old database: %s\n"),819 *errmsg = g_strdup_printf (_("Couldn't import from old database: %s\n"),
448 import_errmsg ? import_errmsg : "(err = NULL)");820 import_errmsg ? import_errmsg : "(err = NULL)");
@@ -452,13 +824,11 @@
452 init_success:824 init_success:
453 g_free (newfile);825 g_free (newfile);
454 g_free (oldfile);826 g_free (oldfile);
455 array = katze_array_new (KATZE_TYPE_ARRAY);827 bookmarks = MIDORI_BOOKMARKS_DB (g_object_new (TYPE_MIDORI_BOOKMARKS_DB, NULL));
456 g_signal_connect (array, "add-item",828 bookmarks->db = db;
457 G_CALLBACK (midori_bookmarks_add_item_cb), db);829
458 g_signal_connect (array, "remove-item",830 g_object_set_data (G_OBJECT (bookmarks), "db", db);
459 G_CALLBACK (midori_bookmarks_remove_item_cb), db);831 return bookmarks;
460 g_object_set_data (G_OBJECT (array), "db", db);
461 return array;
462832
463 init_failed:833 init_failed:
464 g_free (newfile);834 g_free (newfile);
@@ -470,40 +840,140 @@
470 return NULL;840 return NULL;
471}841}
472842
843/**
844 * midori_bookmarks_db_on_quit:
845 * @bookmarks: the main bookmark array
846 *
847 * Delete the main bookmark array.
848 *
849 * Since: 0.5.2
850 **/
473void851void
474midori_bookmarks_on_quit (KatzeArray* array)852midori_bookmarks_db_on_quit (MidoriBookmarksDb* bookmarks)
475{853{
476 g_return_if_fail (KATZE_IS_ARRAY (array));854 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks));
477855
478 sqlite3* db = g_object_get_data (G_OBJECT (array), "db");856 g_object_unref (bookmarks);
479 g_return_if_fail (db != NULL);
480 sqlite3_close (db);
481}857}
482858
859/**
860 * midori_bookmarks_db_import_array:
861 * @array: the main bookmark array
862 * @array: #KatzeArray containing the items to import
863 * @parentid: the id of folder
864 *
865 * Imports the items of @array as childs of the folder
866 * identfied by @parentid.
867 *
868 * Since: 0.5.2
869 **/
483void870void
484midori_bookmarks_import_array (KatzeArray* bookmarks,871midori_bookmarks_db_import_array (MidoriBookmarksDb* bookmarks,
485 KatzeArray* array,872 KatzeArray* array,
486 gint64 parentid)873 gint64 parentid)
487{874{
488 GList* list;875 GList* list;
489 KatzeItem* item;876 KatzeItem* item;
490877
491 if (!bookmarks)878 g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks));
492 return;879 g_return_if_fail (KATZE_IS_ARRAY (array));
493880
494 KATZE_ARRAY_FOREACH_ITEM_L (item, array, list)881 KATZE_ARRAY_FOREACH_ITEM_L (item, array, list)
495 {882 {
496 katze_item_set_meta_integer (item, "parentid", parentid);883 katze_item_set_meta_integer (item, "parentid", parentid);
497 katze_array_add_item (bookmarks, item);884 midori_bookmarks_db_add_item (bookmarks, item);
498 if (KATZE_IS_ARRAY (item))885 if (KATZE_IS_ARRAY (item))
499 midori_bookmarks_import_array (bookmarks, KATZE_ARRAY (item),886 midori_bookmarks_db_import_array (bookmarks, KATZE_ARRAY (item),
500 katze_item_get_meta_integer(item, "id"));887 katze_item_get_meta_integer(item, "id"));
501 }888 }
502 g_list_free (list);889 g_list_free (list);
503}890}
504891
505/**892/**
506 * midori_array_query_recursive:893 * midori_bookmarks_db_array_from_statement:
894 * @stmt: the sqlite returned statement
895 * @bookmarks: the database controller
896 *
897 * Internal function that populate a #KatzeArray by processing the @stmt
898 * rows identifying:
899 * a- if the item is already in memory
900 * in this case the item data is updated with retreived database content
901 * and the already existing item is populated in the returned #KatzeArray
902 * b- if the data is a folder
903 * a new #KatzeArray item is populated in the returned #KatzeArray and
904 * memorized for future use.
905 * c- if the data is a bookmark
906 * a new #KatzeItem item is populated in the returned #KatzeArray and
907 * memorized for furure use.
908 *
909 * Return value: the populated #KatzeArray
910 **/
911static KatzeArray*
912midori_bookmarks_db_array_from_statement (sqlite3_stmt* stmt,
913 MidoriBookmarksDb* bookmarks)
914{
915 KatzeArray *array;
916 gint result;
917 gint cols;
918
919 array = katze_array_new (KATZE_TYPE_ITEM);
920 cols = sqlite3_column_count (stmt);
921
922 while ((result = sqlite3_step (stmt)) == SQLITE_ROW)
923 {
924 gint i;
925 KatzeItem* item;
926 KatzeItem* found;
927
928 item = katze_item_new ();
929 for (i = 0; i < cols; i++)
930 katze_item_set_value_from_column (stmt, i, item);
931
932 if (KATZE_ITEM_IS_FOLDER (item))
933 {
934 g_object_unref (item);
935
936 item = KATZE_ITEM (katze_array_new (KATZE_TYPE_ITEM));
937
938 for (i = 0; i < cols; i++)
939 katze_item_set_value_from_column (stmt, i, item);
940 }
941
942 katze_array_add_item (array, item);
943 }
944
945 sqlite3_clear_bindings (stmt);
946 sqlite3_reset (stmt);
947 return array;
948}
949
950/**
951 * midori_bookmarks_db_array_from_sqlite:
952 * @array: the main bookmark array
953 * @sqlcmd: the sqlcmd to execute
954 *
955 * Internal function that process the requested @sqlcmd.
956 *
957 * Return value: a #KatzeArray on success, %NULL otherwise
958 **/
959static KatzeArray*
960midori_bookmarks_db_array_from_sqlite (MidoriBookmarksDb* bookmarks,
961 const gchar* sqlcmd)
962{
963 sqlite3_stmt* stmt;
964 gint result;
965
966 g_return_val_if_fail (bookmarks->db != NULL, NULL);
967
968 result = sqlite3_prepare_v2 (bookmarks->db, sqlcmd, -1, &stmt, NULL);
969 if (result != SQLITE_OK)
970 return NULL;
971
972 return midori_bookmarks_db_array_from_statement (stmt, bookmarks);
973}
974
975/**
976 * midori_bookmarks_db_query_recursive:
507 * @array: the main bookmark array977 * @array: the main bookmark array
508 * @fields: comma separated list of fields978 * @fields: comma separated list of fields
509 * @condition: condition, like "folder = '%q'"979 * @condition: condition, like "folder = '%q'"
@@ -514,38 +984,35 @@
514 *984 *
515 * Return value: a #KatzeArray on success, %NULL otherwise985 * Return value: a #KatzeArray on success, %NULL otherwise
516 *986 *
517 * Since: 0.4.4987 * Since: 0.5.2
518 **/988 **/
519KatzeArray*989KatzeArray*
520midori_array_query_recursive (KatzeArray* bookmarks,990midori_bookmarks_db_query_recursive (MidoriBookmarksDb* bookmarks,
521 const gchar* fields,991 const gchar* fields,
522 const gchar* condition,992 const gchar* condition,
523 const gchar* value,993 const gchar* value,
524 gboolean recursive)994 gboolean recursive)
525{995{
526 sqlite3* db;
527 gchar* sqlcmd;996 gchar* sqlcmd;
528 char* sqlcmd_value;997 char* sqlcmd_value;
529 KatzeArray* array;998 KatzeArray* array;
530 KatzeItem* item;999 KatzeItem* item;
531 GList* list;1000 GList* list;
5321001
533 g_return_val_if_fail (KATZE_IS_ARRAY (bookmarks), NULL);1002 g_return_val_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks), NULL);
534 g_return_val_if_fail (fields, NULL);1003 g_return_val_if_fail (fields, NULL);
535 g_return_val_if_fail (condition, NULL);1004 g_return_val_if_fail (condition, NULL);
536 db = g_object_get_data (G_OBJECT (bookmarks), "db");
537 g_return_val_if_fail (db != NULL, NULL);
5381005
539 sqlcmd = g_strdup_printf ("SELECT %s FROM bookmarks WHERE %s "1006 sqlcmd = g_strdup_printf ("SELECT %s FROM bookmarks WHERE %s "
540 "ORDER BY (uri='') ASC, title DESC", fields, condition);1007 "ORDER BY (uri='') ASC, title DESC", fields, condition);
541 if (strstr (condition, "%q"))1008 if (strstr (condition, "%q"))
542 {1009 {
543 sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : "");1010 sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : "");
544 array = katze_array_from_sqlite (db, sqlcmd_value);1011 array = midori_bookmarks_db_array_from_sqlite (bookmarks, sqlcmd_value);
545 sqlite3_free (sqlcmd_value);1012 sqlite3_free (sqlcmd_value);
546 }1013 }
547 else1014 else
548 array = katze_array_from_sqlite (db, sqlcmd);1015 array = midori_bookmarks_db_array_from_sqlite (bookmarks, sqlcmd);
549 g_free (sqlcmd);1016 g_free (sqlcmd);
5501017
551 if (!recursive)1018 if (!recursive)
@@ -556,9 +1023,9 @@
556 if (KATZE_ITEM_IS_FOLDER (item))1023 if (KATZE_ITEM_IS_FOLDER (item))
557 {1024 {
558 gchar* parentid = g_strdup_printf ("%" G_GINT64_FORMAT,1025 gchar* parentid = g_strdup_printf ("%" G_GINT64_FORMAT,
559 katze_item_get_meta_integer (item, "id"));1026 katze_item_get_meta_integer (item, "id"));
560 KatzeArray* subarray = midori_array_query_recursive (bookmarks,1027 KatzeArray* subarray = midori_bookmarks_db_query_recursive (bookmarks,
561 fields, "parentid=%q", parentid, TRUE);1028 fields, "parentid=%q", parentid, TRUE);
562 KatzeItem* subitem;1029 KatzeItem* subitem;
563 GList* sublist;1030 GList* sublist;
5641031
@@ -576,21 +1043,21 @@
576}1043}
5771044
578static gint641045static gint64
579count_from_sqlite (sqlite3* db,1046midori_bookmarks_db_count_from_sqlite (sqlite3* db,
580 const gchar* sqlcmd)1047 const gchar* sqlcmd)
581{1048{
582 gint64 count = -1;1049 gint64 count = -1;
583 sqlite3_stmt* stmt;1050 sqlite3_stmt* stmt;
584 gint result;1051 gint result;
585 1052
586 result = sqlite3_prepare_v2 (db, sqlcmd, -1, &stmt, NULL);1053 result = sqlite3_prepare_v2 (db, sqlcmd, -1, &stmt, NULL);
587 if (result != SQLITE_OK)1054 if (result != SQLITE_OK)
588 return -1;1055 return -1;
5891056
590 g_assert (sqlite3_column_count (stmt) == 1);1057 g_assert (sqlite3_column_count (stmt) == 1);
591 1058
592 if ((result = sqlite3_step (stmt)) == SQLITE_ROW)1059 if ((result = sqlite3_step (stmt)) == SQLITE_ROW)
593 count = sqlite3_column_int64(stmt, 0);1060 count = sqlite3_column_int64(stmt, 0);
5941061
595 sqlite3_clear_bindings (stmt);1062 sqlite3_clear_bindings (stmt);
596 sqlite3_reset (stmt);1063 sqlite3_reset (stmt);
@@ -599,14 +1066,13 @@
599}1066}
6001067
601static gint641068static gint64
602midori_array_count_recursive_by_id (KatzeArray* bookmarks,1069midori_bookmarks_db_count_recursive_by_id (MidoriBookmarksDb* bookmarks,
603 const gchar* condition,1070 const gchar* condition,
604 const gchar* value,1071 const gchar* value,
605 gint64 id,1072 gint64 id,
606 gboolean recursive)1073 gboolean recursive)
607{1074{
608 gint64 count = -1;1075 gint64 count = -1;
609 sqlite3* db;
610 gchar* sqlcmd;1076 gchar* sqlcmd;
611 char* sqlcmd_value;1077 char* sqlcmd_value;
612 sqlite3_stmt* stmt;1078 sqlite3_stmt* stmt;
@@ -615,30 +1081,29 @@
615 GList* iter_ids;1081 GList* iter_ids;
6161082
617 g_return_val_if_fail (condition, -1);1083 g_return_val_if_fail (condition, -1);
618 g_return_val_if_fail (KATZE_IS_ARRAY (bookmarks), -1);1084 g_return_val_if_fail (MIDORI_BOOKMARKS_DB (bookmarks), -1);
619 db = g_object_get_data (G_OBJECT (bookmarks), "db");1085 g_return_val_if_fail (bookmarks->db != NULL, -1);
620 g_return_val_if_fail (db != NULL, -1);
6211086
622 g_assert(!strstr("parentid", condition));1087 g_assert(!strstr("parentid", condition));
6231088
624 if (id > 0)1089 if (id > 0)
625 sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks "1090 sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks "
626 "WHERE parentid = %" G_GINT64_FORMAT " AND %s",1091 "WHERE parentid = %" G_GINT64_FORMAT " AND %s",
627 id,1092 id,
628 condition);1093 condition);
629 else1094 else
630 sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks "1095 sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks "
631 "WHERE parentid IS NULL AND %s ",1096 "WHERE parentid IS NULL AND %s ",
632 condition);1097 condition);
6331098
634 if (strstr (condition, "%q"))1099 if (strstr (condition, "%q"))
635 {1100 {
636 sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : "");1101 sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : "");
637 count = count_from_sqlite (db, sqlcmd_value);1102 count = midori_bookmarks_db_count_from_sqlite (bookmarks->db, sqlcmd_value);
638 sqlite3_free (sqlcmd_value);1103 sqlite3_free (sqlcmd_value);
639 }1104 }
640 else1105 else
641 count = count_from_sqlite (db, sqlcmd);1106 count = midori_bookmarks_db_count_from_sqlite (bookmarks->db, sqlcmd);
6421107
643 g_free (sqlcmd);1108 g_free (sqlcmd);
6441109
@@ -648,28 +1113,28 @@
648 ids = NULL;1113 ids = NULL;
6491114
650 if (id > 0)1115 if (id > 0)
651 sqlcmd_value = sqlite3_mprintf (1116 sqlcmd_value = sqlite3_mprintf (
652 "SELECT id FROM bookmarks "1117 "SELECT id FROM bookmarks "
653 "WHERE parentid = %" G_GINT64_FORMAT " AND uri = ''", id);1118 "WHERE parentid = %" G_GINT64_FORMAT " AND uri = ''", id);
654 else1119 else
655 sqlcmd_value = sqlite3_mprintf (1120 sqlcmd_value = sqlite3_mprintf (
656 "SELECT id FROM bookmarks "1121 "SELECT id FROM bookmarks "
657 "WHERE parentid IS NULL AND uri = ''");1122 "WHERE parentid IS NULL AND uri = ''");
6581123
659 if (sqlite3_prepare_v2 (db, sqlcmd_value, -1, &stmt, NULL) == SQLITE_OK)1124 if (sqlite3_prepare_v2 (bookmarks->db, sqlcmd_value, -1, &stmt, NULL) == SQLITE_OK)
660 {1125 {
661 g_assert (sqlite3_column_count (stmt) == 1);1126 g_assert (sqlite3_column_count (stmt) == 1);
662 1127
663 if ((result = sqlite3_step (stmt)) == SQLITE_ROW)1128 if ((result = sqlite3_step (stmt)) == SQLITE_ROW)
664 {1129 {
665 gint64* pid = g_new (gint64, 1);1130 gint64* pid = g_new (gint64, 1);
666 1131
667 *pid = sqlite3_column_int64(stmt, 0);1132 *pid = sqlite3_column_int64(stmt, 0);
668 ids = g_list_append (ids, pid);1133 ids = g_list_append (ids, pid);
669 }1134 }
670 1135
671 sqlite3_clear_bindings (stmt);1136 sqlite3_clear_bindings (stmt);
672 sqlite3_reset (stmt);1137 sqlite3_reset (stmt);
673 }1138 }
6741139
675 sqlite3_free (sqlcmd_value);1140 sqlite3_free (sqlcmd_value);
@@ -677,29 +1142,29 @@
677 iter_ids = ids;1142 iter_ids = ids;
678 while (iter_ids)1143 while (iter_ids)
679 {1144 {
680 gint64 sub_count = midori_array_count_recursive_by_id (bookmarks,1145 gint64 sub_count = midori_bookmarks_db_count_recursive_by_id (bookmarks,
681 condition,1146 condition,
682 value,1147 value,
683 *(gint64*)(iter_ids->data),1148 *(gint64*)(iter_ids->data),
684 recursive);1149 recursive);
685 1150
686 if (sub_count < 0)1151 if (sub_count < 0)
687 {1152 {
688 g_list_free_full (ids, g_free);1153 g_list_free_full (ids, g_free);
689 return -1;1154 return -1;
690 }1155 }
691 1156
692 count += sub_count;1157 count += sub_count;
693 iter_ids = g_list_next (iter_ids);1158 iter_ids = g_list_next (iter_ids);
694 }1159 }
695 1160
696 g_list_free_full (ids, g_free);1161 g_list_free_full (ids, g_free);
697 return count;1162 return count;
698}1163}
6991164
700/**1165/**
701 * midori_array_count_recursive:1166 * midori_bookmarks_db_count_recursive:
702 * @array: the main bookmark array1167 * @bookmarks: the main bookmark array
703 * @condition: condition, like "folder = '%q'"1168 * @condition: condition, like "folder = '%q'"
704 * @value: a value to be inserted if @condition contains %q1169 * @value: a value to be inserted if @condition contains %q
705 * @recursive: if %TRUE include children1170 * @recursive: if %TRUE include children
@@ -709,19 +1174,19 @@
709 * Since: 0.5.21174 * Since: 0.5.2
710 **/1175 **/
711gint641176gint64
712midori_array_count_recursive (KatzeArray* bookmarks,1177midori_bookmarks_db_count_recursive (MidoriBookmarksDb* bookmarks,
713 const gchar* condition,1178 const gchar* condition,
714 const gchar* value,1179 const gchar* value,
715 KatzeItem* folder,1180 KatzeItem* folder,
716 gboolean recursive)1181 gboolean recursive)
717{1182{
718 gint64 id = -1;1183 gint64 id = -1;
7191184
720 g_return_val_if_fail (!folder || KATZE_ITEM_IS_FOLDER (folder), -1);1185 g_return_val_if_fail (!folder || KATZE_ITEM_IS_FOLDER (folder), -1);
721 1186
722 id = folder ? katze_item_get_meta_integer (folder, "id") : 0;1187 id = folder ? katze_item_get_meta_integer (folder, "id") : 0;
7231188
724 return midori_array_count_recursive_by_id (bookmarks, condition,1189 return midori_bookmarks_db_count_recursive_by_id (bookmarks, condition,
725 value, id,1190 value, id,
726 recursive);1191 recursive);
727}1192}
7281193
=== modified file 'midori/midori-bookmarks-db.h'
--- midori/midori-bookmarks-db.h 2013-09-08 10:53:32 +0000
+++ midori/midori-bookmarks-db.h 2013-09-17 19:35:27 +0000
@@ -16,33 +16,60 @@
16#include <sqlite3.h>16#include <sqlite3.h>
17#include <katze/katze.h>17#include <katze/katze.h>
1818
19KatzeArray*19G_BEGIN_DECLS
20midori_bookmarks_new (char** errmsg);20
2121#define TYPE_MIDORI_BOOKMARKS_DB \
22void22 (midori_bookmarks_db_get_type ())
23midori_bookmarks_on_quit (KatzeArray* array);23#define MIDORI_BOOKMARKS_DB(obj) \
2424 (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDb))
25void25#define MIDORI_BOOKMARKS_DB_CLASS(klass) \
26midori_array_update_item (KatzeArray* bookmarks, KatzeItem* item);26 (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDbClass))
2727#define IS_MIDORI_BOOKMARKS_DB(obj) \
28void28 (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MIDORI_BOOKMARKS_DB))
29midori_bookmarks_import_array (KatzeArray* bookmarks,29#define IS_MIDORI_BOOKMARKS_DB_CLASS(klass) \
30 KatzeArray* array,30 (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MIDORI_BOOKMARKS_DB))
31 gint64 parentid);31#define MIDORI_BOOKMARKS_DB_GET_CLASS(obj) \
3232 (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDbClass))
33KatzeArray*33
34midori_array_query_recursive (KatzeArray* bookmarks,34typedef struct _MidoriBookmarksDb MidoriBookmarksDb;
35 const gchar* fields,35typedef struct _MidoriBookmarksDbClass MidoriBookmarksDbClass;
36 const gchar* condition,36
37 const gchar* value,37GType
38 gboolean recursive);38midori_bookmarks_db_get_type (void) G_GNUC_CONST;
39
40MidoriBookmarksDb*
41midori_bookmarks_db_new (char** errmsg);
42
43void
44midori_bookmarks_db_on_quit (MidoriBookmarksDb* array);
45
46void
47midori_bookmarks_db_add_item (MidoriBookmarksDb* bookmarks, KatzeItem* item);
48
49void
50midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, KatzeItem* item);
51
52void
53midori_bookmarks_db_remove_item (MidoriBookmarksDb* bookmarks, KatzeItem* item);
54
55void
56midori_bookmarks_db_import_array (MidoriBookmarksDb* bookmarks,
57 KatzeArray* array,
58 gint64 parentid);
59
60KatzeArray*
61midori_bookmarks_db_query_recursive (MidoriBookmarksDb* bookmarks,
62 const gchar* fields,
63 const gchar* condition,
64 const gchar* value,
65 gboolean recursive);
3966
40gint6467gint64
41midori_array_count_recursive (KatzeArray* bookmarks,68midori_bookmarks_db_count_recursive (MidoriBookmarksDb* bookmarks,
42 const gchar* condition,69 const gchar* condition,
43 const gchar* value,70 const gchar* value,
44 KatzeItem* folder,71 KatzeItem* folder,
45 gboolean recursive);72 gboolean recursive);
4673
47gint6474gint64
48midori_bookmarks_insert_item_db (sqlite3* db,75midori_bookmarks_insert_item_db (sqlite3* db,
4976
=== modified file 'midori/midori-browser.c'
--- midori/midori-browser.c 2013-09-16 22:00:41 +0000
+++ midori/midori-browser.c 2013-09-17 19:35:27 +0000
@@ -87,7 +87,7 @@
8787
88 MidoriWebSettings* settings;88 MidoriWebSettings* settings;
89 KatzeArray* proxy_array;89 KatzeArray* proxy_array;
90 KatzeArray* bookmarks;90 MidoriBookmarksDb* bookmarks;
91 KatzeArray* trash;91 KatzeArray* trash;
92 KatzeArray* search_engines;92 KatzeArray* search_engines;
93 KatzeArray* history;93 KatzeArray* history;
@@ -195,8 +195,8 @@
195 GtkToolbarStyle style);195 GtkToolbarStyle style);
196196
197static void197static void
198midori_browser_set_bookmarks (MidoriBrowser* browser,198midori_browser_set_bookmarks (MidoriBrowser* browser,
199 KatzeArray* bookmarks);199 MidoriBookmarksDb* bookmarks);
200200
201static void201static void
202midori_browser_add_speed_dial (MidoriBrowser* browser);202midori_browser_add_speed_dial (MidoriBrowser* browser);
@@ -863,7 +863,7 @@
863}863}
864864
865static GtkWidget*865static GtkWidget*
866midori_bookmark_folder_button_new (KatzeArray* array,866midori_bookmark_folder_button_new (MidoriBookmarksDb* array,
867 gint64 selected_parentid)867 gint64 selected_parentid)
868{868{
869 GtkTreeStore* model;869 GtkTreeStore* model;
@@ -1231,18 +1231,9 @@
1231 katze_item_set_meta_integer (bookmark, "parentid", selected);1231 katze_item_set_meta_integer (bookmark, "parentid", selected);
12321232
1233 if (new_bookmark)1233 if (new_bookmark)
1234 katze_array_add_item (browser->bookmarks, bookmark);1234 midori_bookmarks_db_add_item (browser->bookmarks, bookmark);
1235 else1235 else
1236 {1236 midori_bookmarks_db_update_item (browser->bookmarks, bookmark);
1237 midori_array_update_item (browser->bookmarks, bookmark);
1238 midori_browser_update_history (bookmark, "bookmark", "modify");
1239
1240 if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_toolbar)))
1241 if (!gtk_widget_get_visible (browser->bookmarkbar))
1242 _action_set_active (browser, "Bookmarkbar", TRUE);
1243 if (gtk_widget_get_visible (browser->bookmarkbar))
1244 midori_bookmarkbar_populate (browser);
1245 }
12461237
1247 return_status = TRUE;1238 return_status = TRUE;
1248 }1239 }
@@ -2545,7 +2536,7 @@
2545 "bookmarks",2536 "bookmarks",
2546 "Bookmarks",2537 "Bookmarks",
2547 "The bookmarks folder, containing all bookmarks",2538 "The bookmarks folder, containing all bookmarks",
2548 KATZE_TYPE_ARRAY,2539 TYPE_MIDORI_BOOKMARKS_DB,
2549 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));2540 G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
25502541
2551 /**2542 /**
@@ -3273,8 +3264,8 @@
3273 else3264 else
3274 condition = "parentid = %q";3265 condition = "parentid = %q";
32753266
3276 bookmarks = midori_array_query_recursive (browser->bookmarks,3267 bookmarks = midori_bookmarks_db_query_recursive (browser->bookmarks,
3277 "id, title, parentid, uri, app, pos_panel, pos_bar", condition, id, FALSE);3268 "id, title, parentid, uri, app, pos_panel, pos_bar", condition, id, FALSE);
3278 if (!bookmarks)3269 if (!bookmarks)
3279 return FALSE;3270 return FALSE;
32803271
@@ -4308,7 +4299,7 @@
4308 KatzeItem* item;4299 KatzeItem* item;
43094300
4310 item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem");4301 item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem");
4311 katze_array_remove_item (browser->bookmarks, item);4302 midori_bookmarks_db_remove_item (browser->bookmarks, item);
4312}4303}
43134304
4314static void4305static void
@@ -4320,7 +4311,7 @@
4320 MidoriContextAction* menu = midori_context_action_new ("BookmarkContextMenu", NULL, NULL, NULL);4311 MidoriContextAction* menu = midori_context_action_new ("BookmarkContextMenu", NULL, NULL, NULL);
4321 if (KATZE_ITEM_IS_FOLDER (item))4312 if (KATZE_ITEM_IS_FOLDER (item))
4322 {4313 {
4323 gint child_bookmarks_count = midori_array_count_recursive (browser->bookmarks,4314 gint child_bookmarks_count = midori_bookmarks_db_count_recursive (browser->bookmarks,
4324 "uri <> ''", NULL, item, FALSE);4315 "uri <> ''", NULL, item, FALSE);
43254316
4326 GtkAction* action = gtk_action_new ("BookmarkOpenAllTabs", _("Open all in _Tabs"), NULL, STOCK_TAB_NEW);4317 GtkAction* action = gtk_action_new ("BookmarkOpenAllTabs", _("Open all in _Tabs"), NULL, STOCK_TAB_NEW);
@@ -4590,8 +4581,7 @@
4590 if (error)4581 if (error)
4591 g_error_free (error);4582 g_error_free (error);
4592 }4583 }
4593 midori_bookmarks_import_array (browser->bookmarks, bookmarks, selected);4584 midori_bookmarks_db_import_array (browser->bookmarks, bookmarks, selected);
4594
4595 g_object_unref (bookmarks);4585 g_object_unref (bookmarks);
4596 g_free (path);4586 g_free (path);
4597 }4587 }
@@ -4645,7 +4635,7 @@
4645 return;4635 return;
46464636
4647 error = NULL;4637 error = NULL;
4648 bookmarks = midori_array_query_recursive (browser->bookmarks,4638 bookmarks = midori_bookmarks_db_query_recursive (browser->bookmarks,
4649 "*", "parentid IS NULL", NULL, TRUE);4639 "*", "parentid IS NULL", NULL, TRUE);
4650 if (!midori_array_to_file (bookmarks, path, format, &error))4640 if (!midori_array_to_file (bookmarks, path, format, &error))
4651 {4641 {
@@ -7060,6 +7050,16 @@
7060}7050}
70617051
7062static void7052static void
7053midori_bookmarkbar_update_item_cb (KatzeArray* bookmarks,
7054 KatzeItem* item,
7055 MidoriBrowser* browser)
7056{
7057 if (gtk_widget_get_visible (browser->bookmarkbar))
7058 midori_bookmarkbar_populate (browser);
7059 midori_browser_update_history (item, "bookmark", "modify");
7060}
7061
7062static void
7063midori_bookmarkbar_remove_item_cb (KatzeArray* bookmarks,7063midori_bookmarkbar_remove_item_cb (KatzeArray* bookmarks,
7064 KatzeItem* item,7064 KatzeItem* item,
7065 MidoriBrowser* browser)7065 MidoriBrowser* browser)
@@ -7091,8 +7091,8 @@
7091 gtk_toolbar_insert (GTK_TOOLBAR (browser->bookmarkbar),7091 gtk_toolbar_insert (GTK_TOOLBAR (browser->bookmarkbar),
7092 gtk_separator_tool_item_new (), -1);7092 gtk_separator_tool_item_new (), -1);
70937093
7094 array = midori_array_query_recursive (browser->bookmarks,7094 array = midori_bookmarks_db_query_recursive (browser->bookmarks,
7095 "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "toolbar = 1", NULL, FALSE);7095 "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "toolbar = 1", NULL, FALSE);
7096 if (!array)7096 if (!array)
7097 {7097 {
7098 _action_set_sensitive (browser, "BookmarkAdd", FALSE);7098 _action_set_sensitive (browser, "BookmarkAdd", FALSE);
@@ -7132,7 +7132,7 @@
71327132
7133static void7133static void
7134midori_browser_set_bookmarks (MidoriBrowser* browser,7134midori_browser_set_bookmarks (MidoriBrowser* browser,
7135 KatzeArray* bookmarks)7135 MidoriBookmarksDb* bookmarks)
7136{7136{
7137 MidoriWebSettings* settings;7137 MidoriWebSettings* settings;
71387138
@@ -7141,6 +7141,8 @@
7141 g_signal_handlers_disconnect_by_func (browser->bookmarks,7141 g_signal_handlers_disconnect_by_func (browser->bookmarks,
7142 midori_bookmarkbar_add_item_cb, browser);7142 midori_bookmarkbar_add_item_cb, browser);
7143 g_signal_handlers_disconnect_by_func (browser->bookmarks,7143 g_signal_handlers_disconnect_by_func (browser->bookmarks,
7144 midori_bookmarkbar_update_item_cb, browser);
7145 g_signal_handlers_disconnect_by_func (browser->bookmarks,
7144 midori_bookmarkbar_remove_item_cb, browser);7146 midori_bookmarkbar_remove_item_cb, browser);
7145 }7147 }
71467148
@@ -7174,6 +7176,8 @@
7174 g_object_notify (G_OBJECT (settings), "show-bookmarkbar");7176 g_object_notify (G_OBJECT (settings), "show-bookmarkbar");
7175 g_signal_connect_after (bookmarks, "add-item",7177 g_signal_connect_after (bookmarks, "add-item",
7176 G_CALLBACK (midori_bookmarkbar_add_item_cb), browser);7178 G_CALLBACK (midori_bookmarkbar_add_item_cb), browser);
7179 g_signal_connect_after (bookmarks, "update-item",
7180 G_CALLBACK (midori_bookmarkbar_update_item_cb), browser);
7177 g_signal_connect_after (bookmarks, "remove-item",7181 g_signal_connect_after (bookmarks, "remove-item",
7178 G_CALLBACK (midori_bookmarkbar_remove_item_cb), browser);7182 G_CALLBACK (midori_bookmarkbar_remove_item_cb), browser);
7179}7183}
71807184
=== modified file 'midori/midori-frontend.c'
--- midori/midori-frontend.c 2013-09-08 11:09:40 +0000
+++ midori/midori-frontend.c 2013-09-17 19:35:27 +0000
@@ -487,9 +487,9 @@
487 }487 }
488 g_free (uri);488 g_free (uri);
489489
490 KatzeArray* bookmarks;490 MidoriBookmarksDb* bookmarks;
491 gchar* errmsg = NULL;491 gchar* errmsg = NULL;
492 if (!(bookmarks = midori_bookmarks_new (&errmsg)))492 if (!(bookmarks = midori_bookmarks_db_new (&errmsg)))
493 {493 {
494 g_string_append_printf (error_messages,494 g_string_append_printf (error_messages,
495 _("Bookmarks couldn't be loaded: %s\n"), errmsg);495 _("Bookmarks couldn't be loaded: %s\n"), errmsg);
@@ -596,11 +596,11 @@
596midori_normal_app_on_quit (MidoriApp* app)596midori_normal_app_on_quit (MidoriApp* app)
597{597{
598 MidoriWebSettings* settings = katze_object_get_object (app, "settings");598 MidoriWebSettings* settings = katze_object_get_object (app, "settings");
599 KatzeArray* bookmarks = katze_object_get_object (app, "bookmarks");599 MidoriBookmarksDb* bookmarks = katze_object_get_object (app, "bookmarks");
600 KatzeArray* history = katze_object_get_object (app, "history");600 KatzeArray* history = katze_object_get_object (app, "history");
601601
602 g_object_notify (G_OBJECT (settings), "load-on-startup");602 g_object_notify (G_OBJECT (settings), "load-on-startup");
603 midori_bookmarks_on_quit (bookmarks);603 midori_bookmarks_db_on_quit (bookmarks);
604 midori_history_on_quit (history, settings);604 midori_history_on_quit (history, settings);
605 midori_private_data_on_quit (settings);605 midori_private_data_on_quit (settings);
606606
607607
=== modified file 'panels/midori-bookmarks.c'
--- panels/midori-bookmarks.c 2013-09-08 11:09:40 +0000
+++ panels/midori-bookmarks.c 2013-09-17 19:35:27 +0000
@@ -45,7 +45,7 @@
45 GtkWidget* delete;45 GtkWidget* delete;
46 GtkWidget* treeview;46 GtkWidget* treeview;
47 MidoriApp* app;47 MidoriApp* app;
48 KatzeArray* array;48 MidoriBookmarksDb* bookmarks_db;
4949
50 gint filter_timeout;50 gint filter_timeout;
51 gchar* filter;51 gchar* filter;
@@ -125,6 +125,7 @@
125 return STOCK_BOOKMARKS;125 return STOCK_BOOKMARKS;
126}126}
127127
128#if 0 /* Make sure the following function is never used */
128/* TODO: Function never used */129/* TODO: Function never used */
129void130void
130midori_bookmarks_export_array_db (sqlite3* db,131midori_bookmarks_export_array_db (sqlite3* db,
@@ -138,7 +139,7 @@
138 gchar* parent_id;139 gchar* parent_id;
139140
140 parent_id = g_strdup_printf ("%" G_GINT64_FORMAT, parentid);141 parent_id = g_strdup_printf ("%" G_GINT64_FORMAT, parentid);
141 if (!(root_array = midori_array_query_recursive (array, "*", "parentid = %q", parent_id, FALSE)))142 if (!(root_array = midori_bookmarks_db_query_recursive (array, "*", "parentid = %q", parent_id, FALSE)))
142 {143 {
143 g_free (parent_id);144 g_free (parent_id);
144 return;145 return;
@@ -160,6 +161,7 @@
160 g_free (parent_id);161 g_free (parent_id);
161 g_list_free (list);162 g_list_free (list);
162}163}
164#endif /* 0 */
163165
164static KatzeArray*166static KatzeArray*
165midori_bookmarks_read_from_db (MidoriBookmarks* bookmarks,167midori_bookmarks_read_from_db (MidoriBookmarks* bookmarks,
@@ -169,21 +171,21 @@
169 KatzeArray* array;171 KatzeArray* array;
170172
171 if (keyword && *keyword)173 if (keyword && *keyword)
172 array = midori_array_query_recursive (bookmarks->array,174 array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db,
173 "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "title LIKE '%%%q%%'", keyword, FALSE);175 "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "title LIKE '%%%q%%'", keyword, FALSE);
174 else176 else
175 {177 {
176 if (parentid > 0)178 if (parentid > 0)
177 {179 {
178 gchar* parent_id = g_strdup_printf ("%" G_GINT64_FORMAT, parentid);180 gchar* parent_id = g_strdup_printf ("%" G_GINT64_FORMAT, parentid);
179 array = midori_array_query_recursive (bookmarks->array,181 array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db,
180 "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid = %q", parent_id, FALSE);182 "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid = %q", parent_id, FALSE);
181183
182 g_free (parent_id);184 g_free (parent_id);
183 }185 }
184 else186 else
185 array = midori_array_query_recursive (bookmarks->array,187 array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db,
186 "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid IS NULL", NULL, FALSE);188 "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid IS NULL", NULL, FALSE);
187 }189 }
188 return array ? array : katze_array_new (KATZE_TYPE_ITEM);190 return array ? array : katze_array_new (KATZE_TYPE_ITEM);
189}191}
@@ -274,9 +276,9 @@
274 else276 else
275 parentid = 0;277 parentid = 0;
276278
277 katze_array_remove_item (bookmarks->array, item);
278 katze_item_set_meta_integer (item, "parentid", parentid);279 katze_item_set_meta_integer (item, "parentid", parentid);
279 katze_array_add_item (bookmarks->array, item);280
281 midori_bookmarks_db_update_item (bookmarks->bookmarks_db, item);
280282
281 g_object_unref (item);283 g_object_unref (item);
282 if (new_parent)284 if (new_parent)
@@ -416,9 +418,9 @@
416418
417 if (KATZE_ITEM_IS_FOLDER (item))419 if (KATZE_ITEM_IS_FOLDER (item))
418 {420 {
419 gint child_folders_count = midori_array_count_recursive (bookmarks->array,421 gint child_folders_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db,
420 "uri = ''", NULL, item, FALSE);422 "uri = ''", NULL, item, FALSE);
421 gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array,423 gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db,
422 "uri <> ''", NULL, item, FALSE);424 "uri <> ''", NULL, item, FALSE);
423 gchar* child_folders_str = midori_bookmarks_statusbar_subfolders_str (child_folders_count);425 gchar* child_folders_str = midori_bookmarks_statusbar_subfolders_str (child_folders_count);
424 gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count);426 gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count);
@@ -451,9 +453,9 @@
451 }453 }
452 else454 else
453 {455 {
454 gint child_folders_count = midori_array_count_recursive (bookmarks->array,456 gint child_folders_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db,
455 "uri = ''", NULL, NULL, FALSE);457 "uri = ''", NULL, NULL, FALSE);
456 gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array,458 gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db,
457 "uri <> ''", NULL, NULL, FALSE);459 "uri <> ''", NULL, NULL, FALSE);
458 gchar* child_folders_str = midori_bookmarks_statusbar_subfolders_str (child_folders_count);460 gchar* child_folders_str = midori_bookmarks_statusbar_subfolders_str (child_folders_count);
459 gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count);461 gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count);
@@ -499,10 +501,10 @@
499501
500 /* Manually remove the iter and block clearing the treeview */502 /* Manually remove the iter and block clearing the treeview */
501 gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);503 gtk_tree_store_remove (GTK_TREE_STORE (model), &iter);
502 g_signal_handlers_block_by_func (bookmarks->array,504 g_signal_handlers_block_by_func (bookmarks->bookmarks_db,
503 midori_bookmarks_remove_item_cb, bookmarks);505 midori_bookmarks_remove_item_cb, bookmarks);
504 katze_array_remove_item (bookmarks->array, item);506 midori_bookmarks_db_remove_item (bookmarks->bookmarks_db, item);
505 g_signal_handlers_unblock_by_func (bookmarks->array,507 g_signal_handlers_unblock_by_func (bookmarks->bookmarks_db,
506 midori_bookmarks_remove_item_cb, bookmarks);508 midori_bookmarks_remove_item_cb, bookmarks);
507 g_object_unref (item);509 g_object_unref (item);
508 }510 }
@@ -585,9 +587,9 @@
585 GtkTreeModel* model;587 GtkTreeModel* model;
586588
587 model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview));589 model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview));
588 if (bookmarks->array)590 if (bookmarks->bookmarks_db)
589 {591 {
590 g_object_unref (bookmarks->array);592 g_object_unref (bookmarks->bookmarks_db);
591 gtk_tree_store_clear (GTK_TREE_STORE (model));593 gtk_tree_store_clear (GTK_TREE_STORE (model));
592 }594 }
593 katze_assign (bookmarks->app, app);595 katze_assign (bookmarks->app, app);
@@ -595,13 +597,13 @@
595 return;597 return;
596598
597 g_object_ref (app);599 g_object_ref (app);
598 bookmarks->array = katze_object_get_object (app, "bookmarks");600 bookmarks->bookmarks_db = katze_object_get_object (app, "bookmarks");
599 midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model), NULL, 0, NULL);601 midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model), NULL, 0, NULL);
600 g_signal_connect_after (bookmarks->array, "add-item",602 g_signal_connect_after (bookmarks->bookmarks_db, "add-item",
601 G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks);603 G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks);
602 g_signal_connect (bookmarks->array, "remove-item",604 g_signal_connect (bookmarks->bookmarks_db, "remove-item",
603 G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks);605 G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks);
604 g_signal_connect (bookmarks->array, "update",606 g_signal_connect (bookmarks->bookmarks_db, "update",
605 G_CALLBACK (midori_bookmarks_update_cb), bookmarks);607 G_CALLBACK (midori_bookmarks_update_cb), bookmarks);
606 g_signal_connect_after (model, "row-changed",608 g_signal_connect_after (model, "row-changed",
607 G_CALLBACK (midori_bookmarks_row_changed_cb),609 G_CALLBACK (midori_bookmarks_row_changed_cb),
@@ -835,7 +837,7 @@
835 menu = gtk_menu_new ();837 menu = gtk_menu_new ();
836 if (KATZE_ITEM_IS_FOLDER (item))838 if (KATZE_ITEM_IS_FOLDER (item))
837 {839 {
838 gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array,840 gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db,
839 "uri <> ''", NULL, item, FALSE);841 "uri <> ''", NULL, item, FALSE);
840842
841 midori_bookmarks_popup_item (menu,843 midori_bookmarks_popup_item (menu,
842844
=== modified file 'tests/bookmarks.c'
--- tests/bookmarks.c 2012-11-25 15:37:41 +0000
+++ tests/bookmarks.c 2013-09-17 19:35:27 +0000
@@ -10,11 +10,11 @@
10 */10 */
1111
12#include "midori.h"12#include "midori.h"
13#include "panels/midori-bookmarks.h"13#include "midori-bookmarks-db.h"
1414
15typedef struct15typedef struct
16{16{
17 KatzeArray* db_bookmarks;17 MidoriBookmarksDb* db_bookmarks;
18 KatzeArray* test_bookmarks;18 KatzeArray* test_bookmarks;
19} BookmarksFixture;19} BookmarksFixture;
2020
@@ -37,7 +37,7 @@
37 KatzeArray* folder;37 KatzeArray* folder;
38 gchar *errmsg = NULL;38 gchar *errmsg = NULL;
3939
40 if (!(fixture->db_bookmarks = midori_bookmarks_new (&errmsg)))40 if (!(fixture->db_bookmarks = midori_bookmarks_db_new (&errmsg)))
41 g_error ("Bookmarks couldn't be loaded: %s\n", errmsg);41 g_error ("Bookmarks couldn't be loaded: %s\n", errmsg);
42 g_assert (errmsg == NULL);42 g_assert (errmsg == NULL);
43 g_assert (g_object_get_data (G_OBJECT (fixture->db_bookmarks), "db"));43 g_assert (g_object_get_data (G_OBJECT (fixture->db_bookmarks), "db"));
@@ -84,8 +84,8 @@
84fixture_teardown (BookmarksFixture* fixture,84fixture_teardown (BookmarksFixture* fixture,
85 const TestParameters *params)85 const TestParameters *params)
86{86{
87 midori_bookmarks_on_quit (fixture->db_bookmarks);87 midori_bookmarks_db_on_quit (fixture->db_bookmarks);
88 g_object_unref (fixture->db_bookmarks);88 /* g_object_unref (fixture->db_bookmarks); */
89 g_object_unref (fixture->test_bookmarks);89 g_object_unref (fixture->test_bookmarks);
90}90}
9191
@@ -112,7 +112,7 @@
112/* NB: assumes "title" is unique in a set */112/* NB: assumes "title" is unique in a set */
113static void113static void
114compare_test_and_db (KatzeArray* test_bookmarks,114compare_test_and_db (KatzeArray* test_bookmarks,
115 KatzeArray* db_bookmarks,115 MidoriBookmarksDb* db_bookmarks,
116 gboolean verbose)116 gboolean verbose)
117{117{
118 KatzeArray* db_items;118 KatzeArray* db_items;
@@ -127,7 +127,7 @@
127 g_print ("----------\n");127 g_print ("----------\n");
128 }128 }
129129
130 db_items = midori_array_query_recursive (db_bookmarks,130 db_items = midori_bookmarks_db_query_recursive (db_bookmarks,
131 "*", "title='%q'", katze_item_get_name (test_item), FALSE);131 "*", "title='%q'", katze_item_get_name (test_item), FALSE);
132132
133 /* FIXME g_assert_cmpint (katze_array_get_length (db_items), ==, 1); */133 /* FIXME g_assert_cmpint (katze_array_get_length (db_items), ==, 1); */
@@ -142,28 +142,33 @@
142}142}
143143
144static void144static void
145print_bookmarks (KatzeArray* test_bookmarks)
146{
147 KatzeItem* item;
148 GList* list;
149 KATZE_ARRAY_FOREACH_ITEM_L (item, test_bookmarks, list)
150 {
151 print_bookmark (item);
152 g_print ("----------\n");
153
154 if (KATZE_ITEM_IS_FOLDER(item))
155 print_bookmarks (KATZE_ARRAY (item));
156 }
157 g_list_free (list);
158}
159
160static void
145insert_bookmarks (KatzeArray* test_bookmarks,161insert_bookmarks (KatzeArray* test_bookmarks,
146 KatzeArray* db_bookmarks,162 MidoriBookmarksDb* db_bookmarks,
147 gboolean verbose)163 gboolean verbose)
148{164{
149 KatzeItem* item;
150 GList* list;
151 sqlite3 *db = g_object_get_data (G_OBJECT (db_bookmarks), "db");
152165
153 KATZE_ARRAY_FOREACH_ITEM_L (item, test_bookmarks, list)166 if (verbose)
154 {167 {
155 if (verbose)168 print_bookmarks (test_bookmarks);
156 {
157 print_bookmark (item);
158 g_print ("----------\n");
159 }
160
161 midori_bookmarks_insert_item_db (db, item, 0);
162
163 if (KATZE_ITEM_IS_FOLDER(item))
164 insert_bookmarks (KATZE_ARRAY (item), db_bookmarks, verbose);
165 }169 }
166 g_list_free (list);170
171 midori_bookmarks_db_import_array (db_bookmarks, test_bookmarks, 0);
167}172}
168173
169static void174static void

Subscribers

People subscribed via source and target branches

to all changes: