Merge lp:~aauzi/midori/fix-1179200-6 into lp:midori
- fix-1179200-6
- Merge into trunk
Status: | Superseded |
---|---|
Proposed branch: | lp:~aauzi/midori/fix-1179200-6 |
Merge into: | lp:midori |
Diff against target: |
2064 lines (+996/-348) 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 (+779/-196) 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-6 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Midori Devs | Pending | ||
Review via email:
|
This proposal has been superseded by a proposal from 2013-09-18.
Commit message
Description of the change
Sixth step for the merge of fix-1179200
This step cache all bookmark items in order to avoid their recreation on database reads.
The cache is recursively populated and cleared for folders addition or removals.
Thanks tp this change, items are consistent in bookmark bar and panel and the following use case/sequence works.
Having a bookmark that's not in the boolùark bar, visible in the panel
Edit it from the panel and add it to the bookmark bar
It appears in the bookmark bar
Edit it from the bar and remove it from the bar
Edit it from the panel
Without the fix:
the item appears with the bookmark bar state checked (the last state it had when it was edited in the panel)
With the fix:
the item appears with the current bookmark bar state: unchecked
Unmerged revisions
Preview Diff
1 | === modified file 'katze/katze-array.c' |
2 | --- katze/katze-array.c 2012-08-08 23:02:56 +0000 |
3 | +++ katze/katze-array.c 2013-09-17 21:28:04 +0000 |
4 | @@ -25,38 +25,14 @@ |
5 | * #KatzeArray is a type aware container for items. |
6 | */ |
7 | |
8 | -struct _KatzeArray |
9 | +G_DEFINE_TYPE (KatzeArray, katze_array, KATZE_TYPE_ITEM); |
10 | + |
11 | +struct _KatzeArrayPrivate |
12 | { |
13 | - KatzeItem parent_instance; |
14 | - |
15 | GType type; |
16 | GList* items; |
17 | }; |
18 | |
19 | -struct _KatzeArrayClass |
20 | -{ |
21 | - KatzeItemClass parent_class; |
22 | - |
23 | - /* Signals */ |
24 | - void |
25 | - (*add_item) (KatzeArray* array, |
26 | - gpointer item); |
27 | - void |
28 | - (*remove_item) (KatzeArray* array, |
29 | - gpointer item); |
30 | - void |
31 | - (*move_item) (KatzeArray* array, |
32 | - gpointer item, |
33 | - gint index); |
34 | - void |
35 | - (*clear) (KatzeArray* array); |
36 | - |
37 | - void |
38 | - (*update) (KatzeArray* array); |
39 | -}; |
40 | - |
41 | -G_DEFINE_TYPE (KatzeArray, katze_array, KATZE_TYPE_ITEM); |
42 | - |
43 | enum { |
44 | ADD_ITEM, |
45 | REMOVE_ITEM, |
46 | @@ -90,7 +66,7 @@ |
47 | if (g_type_is_a (type, KATZE_TYPE_ITEM)) |
48 | katze_item_set_parent (item, array); |
49 | |
50 | - array->items = g_list_append (array->items, item); |
51 | + array->priv->items = g_list_append (array->priv->items, item); |
52 | _katze_array_update (array); |
53 | } |
54 | |
55 | @@ -98,7 +74,7 @@ |
56 | _katze_array_remove_item (KatzeArray* array, |
57 | gpointer item) |
58 | { |
59 | - array->items = g_list_remove (array->items, item); |
60 | + array->priv->items = g_list_remove (array->priv->items, item); |
61 | |
62 | if (KATZE_IS_ITEM (item)) |
63 | katze_item_set_parent (item, NULL); |
64 | @@ -111,8 +87,8 @@ |
65 | gpointer item, |
66 | gint position) |
67 | { |
68 | - array->items = g_list_remove (array->items, item); |
69 | - array->items = g_list_insert (array->items, item, position); |
70 | + array->priv->items = g_list_remove (array->priv->items, item); |
71 | + array->priv->items = g_list_insert (array->priv->items, item, position); |
72 | _katze_array_update (array); |
73 | } |
74 | |
75 | @@ -121,10 +97,10 @@ |
76 | { |
77 | GObject* item; |
78 | |
79 | - while ((item = g_list_nth_data (array->items, 0))) |
80 | + while ((item = g_list_nth_data (array->priv->items, 0))) |
81 | g_signal_emit (array, signals[REMOVE_ITEM], 0, item); |
82 | - g_list_free (array->items); |
83 | - array->items = NULL; |
84 | + g_list_free (array->priv->items); |
85 | + array->priv->items = NULL; |
86 | _katze_array_update (array); |
87 | } |
88 | |
89 | @@ -217,13 +193,18 @@ |
90 | class->move_item = _katze_array_move_item; |
91 | class->clear = _katze_array_clear; |
92 | class->update = _katze_array_update; |
93 | + |
94 | + g_type_class_add_private (class, sizeof (KatzeArrayPrivate)); |
95 | } |
96 | |
97 | static void |
98 | katze_array_init (KatzeArray* array) |
99 | { |
100 | - array->type = G_TYPE_OBJECT; |
101 | - array->items = NULL; |
102 | + array->priv = G_TYPE_INSTANCE_GET_PRIVATE (array, |
103 | + KATZE_TYPE_ARRAY, KatzeArrayPrivate); |
104 | + |
105 | + array->priv->type = G_TYPE_OBJECT; |
106 | + array->priv->items = NULL; |
107 | } |
108 | |
109 | static void |
110 | @@ -232,9 +213,9 @@ |
111 | KatzeArray* array = KATZE_ARRAY (object); |
112 | GList* items; |
113 | |
114 | - for (items = array->items; items; items = g_list_next (items)) |
115 | + for (items = array->priv->items; items; items = g_list_next (items)) |
116 | g_object_unref (items->data); |
117 | - g_list_free (array->items); |
118 | + g_list_free (array->priv->items); |
119 | |
120 | G_OBJECT_CLASS (katze_array_parent_class)->finalize (object); |
121 | } |
122 | @@ -258,7 +239,7 @@ |
123 | g_return_val_if_fail (g_type_is_a (type, G_TYPE_OBJECT), NULL); |
124 | |
125 | array = g_object_new (KATZE_TYPE_ARRAY, NULL); |
126 | - array->type = type; |
127 | + array->priv->type = type; |
128 | |
129 | return array; |
130 | } |
131 | @@ -279,7 +260,7 @@ |
132 | { |
133 | g_return_val_if_fail (KATZE_IS_ARRAY (array), FALSE); |
134 | |
135 | - return g_type_is_a (array->type, is_a_type); |
136 | + return g_type_is_a (array->priv->type, is_a_type); |
137 | } |
138 | |
139 | /** |
140 | @@ -333,7 +314,7 @@ |
141 | { |
142 | g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL); |
143 | |
144 | - return g_list_nth_data (array->items, n); |
145 | + return g_list_nth_data (array->priv->items, n); |
146 | } |
147 | |
148 | /** |
149 | @@ -349,7 +330,7 @@ |
150 | { |
151 | g_return_val_if_fail (KATZE_IS_ARRAY (array), TRUE); |
152 | |
153 | - return !g_list_nth_data (array->items, 0); |
154 | + return !g_list_nth_data (array->priv->items, 0); |
155 | } |
156 | |
157 | /** |
158 | @@ -367,7 +348,7 @@ |
159 | { |
160 | g_return_val_if_fail (KATZE_IS_ARRAY (array), -1); |
161 | |
162 | - return g_list_index (array->items, item); |
163 | + return g_list_index (array->priv->items, item); |
164 | } |
165 | |
166 | /** |
167 | @@ -401,7 +382,7 @@ |
168 | if (token_length < 1) |
169 | token_length = strlen (token); |
170 | |
171 | - for (items = array->items; items; items = g_list_next (items)) |
172 | + for (items = array->priv->items; items; items = g_list_next (items)) |
173 | { |
174 | const gchar* found_token = ((KatzeItem*)items->data)->token; |
175 | if (found_token != NULL) |
176 | @@ -439,7 +420,7 @@ |
177 | g_return_val_if_fail (katze_array_is_a (array, KATZE_TYPE_ITEM), NULL); |
178 | g_return_val_if_fail (uri != NULL, NULL); |
179 | |
180 | - for (items = array->items; items; items = g_list_next (items)) |
181 | + for (items = array->priv->items; items; items = g_list_next (items)) |
182 | { |
183 | const gchar* found_uri = ((KatzeItem*)items->data)->uri; |
184 | if (found_uri != NULL && !strcmp (found_uri, uri)) |
185 | @@ -461,7 +442,7 @@ |
186 | { |
187 | g_return_val_if_fail (KATZE_IS_ARRAY (array), 0); |
188 | |
189 | - return g_list_length (array->items); |
190 | + return g_list_length (array->priv->items); |
191 | } |
192 | |
193 | /** |
194 | @@ -499,7 +480,7 @@ |
195 | { |
196 | g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL); |
197 | |
198 | - return g_list_copy (array->items); |
199 | + return g_list_copy (array->priv->items); |
200 | } |
201 | |
202 | GList* |
203 | @@ -507,7 +488,7 @@ |
204 | { |
205 | g_return_val_if_fail (KATZE_IS_ARRAY (array), NULL); |
206 | |
207 | - return array->items; |
208 | + return array->priv->items; |
209 | } |
210 | |
211 | /** |
212 | |
213 | === modified file 'katze/katze-array.h' |
214 | --- katze/katze-array.h 2011-01-19 20:58:26 +0000 |
215 | +++ katze/katze-array.h 2013-09-17 21:28:04 +0000 |
216 | @@ -31,6 +31,36 @@ |
217 | |
218 | typedef struct _KatzeArray KatzeArray; |
219 | typedef struct _KatzeArrayClass KatzeArrayClass; |
220 | +typedef struct _KatzeArrayPrivate KatzeArrayPrivate; |
221 | + |
222 | +struct _KatzeArray |
223 | +{ |
224 | + KatzeItem parent_instance; |
225 | + |
226 | + KatzeArrayPrivate* priv; |
227 | +}; |
228 | + |
229 | +struct _KatzeArrayClass |
230 | +{ |
231 | + KatzeItemClass parent_class; |
232 | + |
233 | + /* Signals */ |
234 | + void |
235 | + (*add_item) (KatzeArray* array, |
236 | + gpointer item); |
237 | + void |
238 | + (*remove_item) (KatzeArray* array, |
239 | + gpointer item); |
240 | + void |
241 | + (*move_item) (KatzeArray* array, |
242 | + gpointer item, |
243 | + gint index); |
244 | + void |
245 | + (*clear) (KatzeArray* array); |
246 | + |
247 | + void |
248 | + (*update) (KatzeArray* array); |
249 | +}; |
250 | |
251 | GType |
252 | katze_array_get_type (void) G_GNUC_CONST; |
253 | |
254 | === modified file 'katze/katze-item.c' |
255 | --- katze/katze-item.c 2013-07-27 12:35:55 +0000 |
256 | +++ katze/katze-item.c 2013-09-17 21:28:04 +0000 |
257 | @@ -314,6 +314,9 @@ |
258 | { |
259 | g_return_if_fail (KATZE_IS_ITEM (item)); |
260 | |
261 | + if (!g_strcmp0 (item->name, name)) |
262 | + return; |
263 | + |
264 | katze_assign (item->name, g_strdup (name)); |
265 | if (item->parent) |
266 | katze_array_update ((KatzeArray*)item->parent); |
267 | @@ -418,6 +421,9 @@ |
268 | { |
269 | g_return_if_fail (KATZE_IS_ITEM (item)); |
270 | |
271 | + if (!g_strcmp0 (katze_item_get_meta_string (item, "icon"), icon)) |
272 | + return; |
273 | + |
274 | katze_item_set_meta_string (item, "icon", icon); |
275 | if (item->parent) |
276 | katze_array_update ((KatzeArray*)item->parent); |
277 | |
278 | === modified file 'midori/midori-array.c' |
279 | --- midori/midori-array.c 2013-08-05 12:50:34 +0000 |
280 | +++ midori/midori-array.c 2013-09-17 21:28:04 +0000 |
281 | @@ -986,7 +986,17 @@ |
282 | return FALSE; |
283 | } |
284 | |
285 | -static void |
286 | +/** |
287 | + * katze_item_set_value_from_columne: |
288 | + * @stmt: prepared statement |
289 | + * @column: column to read |
290 | + * @item: #KatzeItem to populate |
291 | + * |
292 | + * Stores the column in the given #KatzeItem. |
293 | + * |
294 | + * Since: 0.2.7 |
295 | + **/ |
296 | +void |
297 | katze_item_set_value_from_column (sqlite3_stmt* stmt, |
298 | gint column, |
299 | KatzeItem* item) |
300 | |
301 | === modified file 'midori/midori-bookmarks-db.c' |
302 | --- midori/midori-bookmarks-db.c 2013-09-08 10:53:32 +0000 |
303 | +++ midori/midori-bookmarks-db.c 2013-09-17 21:28:04 +0000 |
304 | @@ -25,14 +25,428 @@ |
305 | #include <unistd.h> |
306 | #endif |
307 | |
308 | -static gboolean |
309 | -midori_bookmarks_update_item_db (sqlite3* db, |
310 | - KatzeItem* item); |
311 | - |
312 | -gint64 |
313 | -midori_bookmarks_insert_item_db (sqlite3* db, |
314 | - KatzeItem* item, |
315 | - gint64 parentid) |
316 | +/** |
317 | + * SECTION:midory-bookmarks-db |
318 | + * @short_description: A #KatzeArray connected to a database |
319 | + * @see_also: #KatzeArray |
320 | + * |
321 | + * #MidoriBookmarksDb is a #KatzeArray specialized for database |
322 | + * interraction. |
323 | + */ |
324 | + |
325 | +struct _MidoriBookmarksDb |
326 | +{ |
327 | + KatzeArray parent_instance; |
328 | + |
329 | + sqlite3* db; |
330 | + GHashTable* all_items; |
331 | +}; |
332 | + |
333 | +struct _MidoriBookmarksDbClass |
334 | +{ |
335 | + KatzeArrayClass parent_class; |
336 | + |
337 | + /* Signals */ |
338 | + void |
339 | + (*update_item) (MidoriBookmarksDb* bookmarks, |
340 | + gpointer item); |
341 | +}; |
342 | + |
343 | +G_DEFINE_TYPE (MidoriBookmarksDb, midori_bookmarks_db, KATZE_TYPE_ARRAY); |
344 | + |
345 | +enum { |
346 | + UPDATE_ITEM, |
347 | + |
348 | + LAST_SIGNAL |
349 | +}; |
350 | + |
351 | +static guint signals[LAST_SIGNAL]; |
352 | + |
353 | +static void |
354 | +_midori_bookmarks_db_add_item (KatzeArray* array, |
355 | + gpointer item); |
356 | + |
357 | +static void |
358 | +_midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, |
359 | + gpointer item); |
360 | + |
361 | +static void |
362 | +_midori_bookmarks_db_remove_item (KatzeArray* array, |
363 | + gpointer item); |
364 | + |
365 | +static void |
366 | +_midori_bookmarks_db_move_item (KatzeArray* array, |
367 | + gpointer item, |
368 | + gint position); |
369 | + |
370 | +static void |
371 | +_midori_bookmarks_db_clear (KatzeArray* array); |
372 | + |
373 | +static void |
374 | +midori_bookmarks_db_finalize (GObject* object); |
375 | + |
376 | +static gint64 |
377 | +midori_bookmarks_db_insert_item_db (sqlite3* db, |
378 | + KatzeItem* item, |
379 | + gint64 parentid); |
380 | + |
381 | +static gboolean |
382 | +midori_bookmarks_db_update_item_db (sqlite3* db, |
383 | + KatzeItem* item); |
384 | + |
385 | +static gboolean |
386 | +midori_bookmarks_db_remove_item_db (sqlite3* db, |
387 | + KatzeItem* item); |
388 | + |
389 | +static guint |
390 | +item_hash (gconstpointer item) |
391 | +{ |
392 | + gint64 id = katze_item_get_meta_integer (KATZE_ITEM (item), "id"); |
393 | + return g_int64_hash (&id); |
394 | +} |
395 | + |
396 | +static gboolean |
397 | +item_equal (gconstpointer item_a, gconstpointer item_b) |
398 | +{ |
399 | + gint64 id_a = katze_item_get_meta_integer (KATZE_ITEM (item_a), "id"); |
400 | + gint64 id_b = katze_item_get_meta_integer (KATZE_ITEM (item_b), "id"); |
401 | + return (id_a == id_b)? TRUE : FALSE; |
402 | +} |
403 | + |
404 | +static void |
405 | +midori_bookmarks_db_class_init (MidoriBookmarksDbClass* class) |
406 | +{ |
407 | + GObjectClass* gobject_class; |
408 | + KatzeArrayClass* katze_array_class; |
409 | + |
410 | + gobject_class = G_OBJECT_CLASS (class); |
411 | + gobject_class->finalize = midori_bookmarks_db_finalize; |
412 | + |
413 | + signals[UPDATE_ITEM] = g_signal_new ( |
414 | + "update-item", |
415 | + G_TYPE_FROM_CLASS (class), |
416 | + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), |
417 | + G_STRUCT_OFFSET (MidoriBookmarksDbClass, update_item), |
418 | + 0, |
419 | + NULL, |
420 | + g_cclosure_marshal_VOID__POINTER, |
421 | + G_TYPE_NONE, 1, |
422 | + G_TYPE_POINTER); |
423 | + |
424 | + katze_array_class = KATZE_ARRAY_CLASS (class); |
425 | + |
426 | + katze_array_class->add_item = _midori_bookmarks_db_add_item; |
427 | + katze_array_class->remove_item = _midori_bookmarks_db_remove_item; |
428 | + katze_array_class->move_item = _midori_bookmarks_db_move_item; |
429 | + katze_array_class->clear = _midori_bookmarks_db_clear; |
430 | + |
431 | + class->update_item = _midori_bookmarks_db_update_item; |
432 | +} |
433 | + |
434 | +static void |
435 | +midori_bookmarks_db_init (MidoriBookmarksDb* bookmarks) |
436 | +{ |
437 | + bookmarks->db = NULL; |
438 | + bookmarks->all_items = g_hash_table_new (item_hash, item_equal); |
439 | + |
440 | + katze_item_set_meta_integer (KATZE_ITEM (bookmarks), "id", 0); |
441 | + katze_item_set_name (KATZE_ITEM (bookmarks), _("Bookmarks")); |
442 | + g_hash_table_insert (bookmarks->all_items, bookmarks, bookmarks); |
443 | + /* g_object_ref (bookmarks); */ |
444 | +} |
445 | + |
446 | +static void |
447 | +midori_bookmarks_db_finalize (GObject* object) |
448 | +{ |
449 | + MidoriBookmarksDb* bookmarks = MIDORI_BOOKMARKS_DB (object); |
450 | + |
451 | + if (bookmarks->db) |
452 | + { |
453 | + sqlite3_close (bookmarks->db); |
454 | + } |
455 | + |
456 | + g_hash_table_unref (bookmarks->all_items); |
457 | + |
458 | + G_OBJECT_CLASS (midori_bookmarks_db_parent_class)->finalize (object); |
459 | +} |
460 | + |
461 | +/** |
462 | + * midori_bookmarks_db_get_item_parent: |
463 | + * @bookmarks: the main bookmarks array |
464 | + * @item: a #KatzeItem |
465 | + * |
466 | + * Internal function that find the parent of the @item thanks to its %parentid |
467 | + **/ |
468 | +static KatzeArray* |
469 | +midori_bookmarks_db_get_item_parent (MidoriBookmarksDb* bookmarks, |
470 | + gpointer item) |
471 | +{ |
472 | + KatzeArray* parent; |
473 | + gint64 parentid; |
474 | + |
475 | + parentid = katze_item_get_meta_integer (KATZE_ITEM (item), "parentid"); |
476 | + |
477 | + if (parentid == 0) |
478 | + { |
479 | + parent = KATZE_ARRAY (bookmarks); |
480 | + } |
481 | + else |
482 | + { |
483 | + KatzeItem *search = katze_item_new (); |
484 | + |
485 | + katze_item_set_meta_integer(search, "id", parentid); |
486 | + |
487 | + parent = KATZE_ARRAY (g_hash_table_lookup (bookmarks->all_items, search)); |
488 | + |
489 | + g_object_unref (search); |
490 | + } |
491 | + |
492 | + return parent; |
493 | +} |
494 | + |
495 | +/** |
496 | + * _midori_bookmarks_db_add_item: |
497 | + * @array: the main bookmarks array |
498 | + * @item: a #KatzeItem |
499 | + * |
500 | + * Internal function that overloads the #KatzeArray %katze_array_add_item(). |
501 | + * It relays the add item to the appropriate #KatzeArray. |
502 | + **/ |
503 | +static void |
504 | +_midori_bookmarks_db_add_item (KatzeArray* array, |
505 | + gpointer item) |
506 | +{ |
507 | + MidoriBookmarksDb *bookmarks; |
508 | + KatzeArray* parent; |
509 | + KatzeArray* db_parent; |
510 | + |
511 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
512 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
513 | + |
514 | + bookmarks = MIDORI_BOOKMARKS_DB (array); |
515 | + |
516 | + parent = katze_item_get_parent (KATZE_ITEM (item)); |
517 | + |
518 | + db_parent = midori_bookmarks_db_get_item_parent (bookmarks, item); |
519 | + |
520 | + g_return_if_fail (db_parent); |
521 | + |
522 | + if (parent == db_parent) |
523 | + { |
524 | + if (IS_MIDORI_BOOKMARKS_DB (parent)) |
525 | + KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->update (parent); |
526 | + else |
527 | + katze_array_update (parent); |
528 | + return; |
529 | + } |
530 | + |
531 | + if (IS_MIDORI_BOOKMARKS_DB (parent)) |
532 | + KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->add_item (parent, item); |
533 | + else if (KATZE_IS_ARRAY (parent)) |
534 | + katze_array_add_item (parent, item); |
535 | +} |
536 | + |
537 | +/** |
538 | + * _midori_bookmarks_db_update_item: |
539 | + * @array: the main bookmarks array |
540 | + * @item: a #KatzeItem |
541 | + * |
542 | + * Internal function that implements the %midori_bookmarks_db_update_item() post-processing. |
543 | + * It relays an update to the appropriate #KatzeArray. |
544 | + **/ |
545 | +static void |
546 | +_midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, |
547 | + gpointer item) |
548 | +{ |
549 | + KatzeArray* parent; |
550 | + |
551 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
552 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
553 | + |
554 | + parent = katze_item_get_parent (KATZE_ITEM (item)); |
555 | + |
556 | + g_return_if_fail (parent); |
557 | + |
558 | + katze_array_update (parent); |
559 | +} |
560 | + |
561 | +/** |
562 | + * _midori_bookmarks_db_remove_item: |
563 | + * @array: the main bookmarks array |
564 | + * @item: a #KatzeItem |
565 | + * |
566 | + * Internal function that overloads the #KatzeArray %katze_array_remove_item(). |
567 | + * It relays the remove item to the appropriate #KatzeArray. |
568 | + **/ |
569 | +static void |
570 | +_midori_bookmarks_db_remove_item (KatzeArray* array, |
571 | + gpointer item) |
572 | +{ |
573 | + KatzeArray* parent; |
574 | + |
575 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
576 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
577 | + |
578 | + parent = katze_item_get_parent (KATZE_ITEM (item)); |
579 | + |
580 | + g_return_if_fail (parent); |
581 | + |
582 | + if (IS_MIDORI_BOOKMARKS_DB (parent)) |
583 | + KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->remove_item (parent, item); |
584 | + else if (KATZE_IS_ARRAY (parent)) |
585 | + katze_array_remove_item (parent, item); |
586 | +} |
587 | + |
588 | +/** |
589 | + * _midori_bookmarks_db_move_item: |
590 | + * @array: the main bookmarks array |
591 | + * @item: a #KatzeItem |
592 | + * @position: the new @item position |
593 | + * |
594 | + * Internal function that overloads the #KatzeArray %katze_array_move_item(). |
595 | + * It relays the move @item to the appropriate #KatzeArray. |
596 | + **/ |
597 | +static void |
598 | +_midori_bookmarks_db_move_item (KatzeArray* array, |
599 | + gpointer item, |
600 | + gint position) |
601 | +{ |
602 | + MidoriBookmarksDb *bookmarks; |
603 | + KatzeArray* parent; |
604 | + |
605 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
606 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
607 | + |
608 | + parent = katze_item_get_parent (KATZE_ITEM (item)); |
609 | + |
610 | + g_return_if_fail (parent); |
611 | + |
612 | + KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->move_item (parent, item, position); |
613 | +} |
614 | + |
615 | +/** |
616 | + * _midori_bookmarks_db_clear: |
617 | + * @array: the main bookmarks array |
618 | + * |
619 | + * Internal function that overloads the #KatzeArray %katze_array_clear(). |
620 | + * It deletes the whole bookmarks data. |
621 | + **/ |
622 | +static void |
623 | +_midori_bookmarks_db_clear (KatzeArray* array) |
624 | +{ |
625 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
626 | + |
627 | + g_critical ("_midori_bookmarks_db_clear: not implemented\n"); |
628 | +} |
629 | + |
630 | +/** |
631 | + * midori_bookmarks_db_signal_update_item: |
632 | + * @array: a #KatzeArray |
633 | + * @item: an item |
634 | + * |
635 | + * Notify an update of the item of the array. |
636 | + * |
637 | + **/ |
638 | +static void |
639 | +midori_bookmarks_db_signal_update_item (MidoriBookmarksDb* array, |
640 | + gpointer item) |
641 | +{ |
642 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
643 | + |
644 | + g_signal_emit (array, signals[UPDATE_ITEM], 0, item); |
645 | +} |
646 | + |
647 | +/** |
648 | + * midori_bookmarks_db_add_item_recursive: |
649 | + * @item: the removed #KatzeItem |
650 | + * @bookmarks : the main bookmarks array |
651 | + * |
652 | + * Internal function that creates memory records of the added @item. |
653 | + * If @item is a #KatzeArray, the function recursiveley adds records |
654 | + * of all its childs. |
655 | + **/ |
656 | +static gint |
657 | +midori_bookmarks_db_add_item_recursive (MidoriBookmarksDb* bookmarks, |
658 | + KatzeItem* item) |
659 | +{ |
660 | + GList* list; |
661 | + KatzeArray* array; |
662 | + gint64 id = 0; |
663 | + gint count = 0; |
664 | + gint64 parentid = katze_item_get_meta_integer (item, "parentid"); |
665 | + |
666 | + id = midori_bookmarks_db_insert_item_db (bookmarks->db, item, parentid); |
667 | + count++; |
668 | + |
669 | + g_object_ref (item); |
670 | + g_hash_table_insert (bookmarks->all_items, item, item); |
671 | + |
672 | + if (!KATZE_IS_ARRAY (item)) |
673 | + return count; |
674 | + |
675 | + array = KATZE_ARRAY (item); |
676 | + |
677 | + KATZE_ARRAY_FOREACH_ITEM_L (item, array, list) |
678 | + { |
679 | + katze_item_set_meta_integer (item, "parentid", id); |
680 | + count += midori_bookmarks_db_add_item_recursive (bookmarks, item); |
681 | + } |
682 | + |
683 | + g_list_free (list); |
684 | + return count; |
685 | +} |
686 | + |
687 | +/** |
688 | + * midori_bookmarks_db_remove_item_recursive: |
689 | + * @item: the removed #KatzeItem |
690 | + * @bookmarks : the main bookmarks array |
691 | + * |
692 | + * Internal function that removes memory records of the removed @item. |
693 | + * If @item is a #KatzeArray, the function recursiveley removes records |
694 | + * of all its childs. |
695 | + **/ |
696 | +static void |
697 | +midori_bookmarks_db_remove_item_recursive (KatzeItem* item, |
698 | + MidoriBookmarksDb* bookmarks) |
699 | +{ |
700 | + GHashTableIter hash_iter; |
701 | + gpointer found; |
702 | + KatzeArray* array; |
703 | + KatzeItem* child; |
704 | + GList* list; |
705 | + |
706 | + if (NULL != (found = g_hash_table_lookup (bookmarks->all_items, item))) |
707 | + { |
708 | + g_hash_table_remove (bookmarks->all_items, found); |
709 | + g_object_unref (found); |
710 | + } |
711 | + |
712 | + if (!KATZE_IS_ARRAY (item)) |
713 | + return; |
714 | + |
715 | + array = KATZE_ARRAY (item); |
716 | + |
717 | + KATZE_ARRAY_FOREACH_ITEM_L (child, array, list) |
718 | + { |
719 | + midori_bookmarks_db_remove_item_recursive (child, bookmarks); |
720 | + } |
721 | + |
722 | + g_list_free (list); |
723 | +} |
724 | + |
725 | +/** |
726 | + * midori_bookmarks_db_insert_item_db: |
727 | + * @db: the #sqlite3 |
728 | + * @item: #KatzeItem the item to insert |
729 | + * |
730 | + * Internal function that does the actual SQL INSERT of the @item in @db. |
731 | + * |
732 | + * Since: 0.5.2 |
733 | + **/ |
734 | +static gint64 |
735 | +midori_bookmarks_db_insert_item_db (sqlite3* db, |
736 | + KatzeItem* item, |
737 | + gint64 parentid) |
738 | { |
739 | gchar* sqlcmd; |
740 | char* errmsg = NULL; |
741 | @@ -70,15 +484,15 @@ |
742 | new_parentid = g_strdup_printf ("NULL"); |
743 | |
744 | sqlcmd = sqlite3_mprintf ( |
745 | - "INSERT INTO bookmarks (id, parentid, title, uri, desc, toolbar, app) " |
746 | - "VALUES (%q, %q, '%q', '%q', '%q', %d, %d)", |
747 | - id, |
748 | - new_parentid, |
749 | - katze_item_get_name (item), |
750 | - katze_str_non_null (uri), |
751 | - katze_str_non_null (desc), |
752 | - katze_item_get_meta_boolean (item, "toolbar"), |
753 | - katze_item_get_meta_boolean (item, "app")); |
754 | + "INSERT INTO bookmarks (id, parentid, title, uri, desc, toolbar, app) " |
755 | + "VALUES (%q, %q, '%q', '%q', '%q', %d, %d)", |
756 | + id, |
757 | + new_parentid, |
758 | + katze_item_get_name (item), |
759 | + katze_str_non_null (uri), |
760 | + katze_str_non_null (desc), |
761 | + katze_item_get_meta_boolean (item, "toolbar"), |
762 | + katze_item_get_meta_boolean (item, "app")); |
763 | |
764 | if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) == SQLITE_OK) |
765 | { |
766 | @@ -89,7 +503,7 @@ |
767 | |
768 | sqlite3_free (sqlcmd); |
769 | sqlcmd = sqlite3_mprintf ( |
770 | - "SELECT seq FROM sqlite_sequence WHERE name = 'bookmarks'"); |
771 | + "SELECT seq FROM sqlite_sequence WHERE name = 'bookmarks'"); |
772 | |
773 | seq_array = katze_array_from_sqlite (db, sqlcmd); |
774 | if (katze_array_get_nth_item (seq_array, 0)) |
775 | @@ -115,8 +529,17 @@ |
776 | return seq; |
777 | } |
778 | |
779 | -gboolean |
780 | -midori_bookmarks_update_item_db (sqlite3* db, |
781 | +/** |
782 | + * midori_bookmarks_db_update_item_db: |
783 | + * @db: the #sqlite3 |
784 | + * @item: #KatzeItem the item to update |
785 | + * |
786 | + * Internal function that does the actual SQL UPDATE of the @item in @db. |
787 | + * |
788 | + * Since: 0.5.2 |
789 | + **/ |
790 | +static gboolean |
791 | +midori_bookmarks_db_update_item_db (sqlite3* db, |
792 | KatzeItem* item) |
793 | { |
794 | gchar* sqlcmd; |
795 | @@ -126,7 +549,7 @@ |
796 | gchar* id; |
797 | |
798 | id = g_strdup_printf ("%" G_GINT64_FORMAT, |
799 | - katze_item_get_meta_integer (item, "id")); |
800 | + katze_item_get_meta_integer (item, "id")); |
801 | |
802 | if (katze_item_get_meta_integer (item, "parentid") > 0) |
803 | parentid = g_strdup_printf ("%" G_GINT64_FORMAT, |
804 | @@ -135,16 +558,16 @@ |
805 | parentid = g_strdup_printf ("NULL"); |
806 | |
807 | sqlcmd = sqlite3_mprintf ( |
808 | - "UPDATE bookmarks SET " |
809 | - "parentid=%q, title='%q', uri='%q', desc='%q', toolbar=%d, app=%d " |
810 | - "WHERE id = %q ;", |
811 | - parentid, |
812 | - katze_item_get_name (item), |
813 | - katze_str_non_null (katze_item_get_uri (item)), |
814 | - katze_str_non_null (katze_item_get_meta_string (item, "desc")), |
815 | - katze_item_get_meta_boolean (item, "toolbar"), |
816 | - katze_item_get_meta_boolean (item, "app"), |
817 | - id); |
818 | + "UPDATE bookmarks SET " |
819 | + "parentid=%q, title='%q', uri='%q', desc='%q', toolbar=%d, app=%d " |
820 | + "WHERE id = %q ;", |
821 | + parentid, |
822 | + katze_item_get_name (item), |
823 | + katze_str_non_null (katze_item_get_uri (item)), |
824 | + katze_str_non_null (katze_item_get_meta_string (item, "desc")), |
825 | + katze_item_get_meta_boolean (item, "toolbar"), |
826 | + katze_item_get_meta_boolean (item, "app"), |
827 | + id); |
828 | |
829 | updated = TRUE; |
830 | if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK) |
831 | @@ -162,68 +585,104 @@ |
832 | } |
833 | |
834 | /** |
835 | + * midori_bookmarks_db_remove_item_db: |
836 | + * @db: the #sqlite3 |
837 | + * @item: #KatzeItem the item to delete |
838 | + * |
839 | + * Internal function that does the actual SQL DELETE of the @item in @db. |
840 | + * |
841 | + * Since: 0.5.2 |
842 | + **/ |
843 | +static gboolean |
844 | +midori_bookmarks_db_remove_item_db (sqlite3* db, |
845 | + KatzeItem* item) |
846 | +{ |
847 | + char* errmsg = NULL; |
848 | + gchar* sqlcmd; |
849 | + gboolean removed = TRUE; |
850 | + gchar* id; |
851 | + |
852 | + id = g_strdup_printf ("%" G_GINT64_FORMAT, |
853 | + katze_item_get_meta_integer (item, "id")); |
854 | + |
855 | + sqlcmd = sqlite3_mprintf ("DELETE FROM bookmarks WHERE id = %q", id); |
856 | + |
857 | + if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK) |
858 | + { |
859 | + g_printerr (_("Failed to remove bookmark item: %s\n"), errmsg); |
860 | + sqlite3_free (errmsg); |
861 | + removed = FALSE; |
862 | + } |
863 | + |
864 | + sqlite3_free (sqlcmd); |
865 | + g_free (id); |
866 | + return removed; |
867 | +} |
868 | + |
869 | +/** |
870 | + * midori_bookmarks_db_add_item: |
871 | + * @bookmarks: the main bookmark array |
872 | + * @item: #KatzeItem the item to update |
873 | + * |
874 | + * Adds the @item in the bookmark data base. |
875 | + * |
876 | + * Since: 0.5.2 |
877 | + **/ |
878 | +void |
879 | +midori_bookmarks_db_add_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) |
880 | +{ |
881 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
882 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
883 | + g_return_if_fail (NULL == katze_item_get_meta_string (item, "id")); |
884 | + |
885 | + midori_bookmarks_db_add_item_recursive (bookmarks, item); |
886 | + |
887 | + katze_array_add_item (KATZE_ARRAY (bookmarks), item); |
888 | +} |
889 | + |
890 | +/** |
891 | * midori_bookmarks_db_update_item: |
892 | * @bookmarks: the main bookmark array |
893 | * @item: #KatzeItem the item to update |
894 | * |
895 | * Updates the @item in the bookmark data base. |
896 | * |
897 | - * Since: 0.5.5 |
898 | - **/ |
899 | -void |
900 | -midori_array_update_item (KatzeArray* bookmarks, |
901 | - KatzeItem* item) |
902 | -{ |
903 | - g_return_if_fail (KATZE_IS_ARRAY (bookmarks)); |
904 | - g_return_if_fail (KATZE_IS_ITEM (item)); |
905 | - g_return_if_fail (katze_item_get_meta_string (item, "id")); |
906 | - g_return_if_fail (0 != katze_item_get_meta_integer (item, "id")); |
907 | - |
908 | - sqlite3* db = g_object_get_data (G_OBJECT (bookmarks), "db"); |
909 | - |
910 | - g_return_if_fail (db); |
911 | - |
912 | - midori_bookmarks_update_item_db (db, item); |
913 | -} |
914 | - |
915 | -void |
916 | -midori_bookmarks_dbtracer (void* dummy, |
917 | - const char* query) |
918 | -{ |
919 | - g_printerr ("%s\n", query); |
920 | -} |
921 | - |
922 | -static void |
923 | -midori_bookmarks_add_item_cb (KatzeArray* array, |
924 | - KatzeItem* item, |
925 | - sqlite3* db) |
926 | -{ |
927 | - midori_bookmarks_insert_item_db (db, item, |
928 | - katze_item_get_meta_integer (item, "parentid")); |
929 | -} |
930 | - |
931 | -static void |
932 | -midori_bookmarks_remove_item_cb (KatzeArray* array, |
933 | - KatzeItem* item, |
934 | - sqlite3* db) |
935 | -{ |
936 | - gchar* sqlcmd; |
937 | - char* errmsg = NULL; |
938 | - gchar* id; |
939 | - |
940 | - id = g_strdup_printf ("%" G_GINT64_FORMAT, |
941 | - katze_item_get_meta_integer (item, "id")); |
942 | - |
943 | - sqlcmd = sqlite3_mprintf ("DELETE FROM bookmarks WHERE id = %q", id); |
944 | - |
945 | - if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK) |
946 | - { |
947 | - g_printerr (_("Failed to remove bookmark item: %s\n"), errmsg); |
948 | - sqlite3_free (errmsg); |
949 | - } |
950 | - |
951 | - sqlite3_free (sqlcmd); |
952 | - g_free (id); |
953 | + * Since: 0.5.2 |
954 | + **/ |
955 | +void |
956 | +midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) |
957 | +{ |
958 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
959 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
960 | + g_return_if_fail (katze_item_get_meta_string (item, "id")); |
961 | + g_return_if_fail (0 != katze_item_get_meta_integer (item, "id")); |
962 | + |
963 | + midori_bookmarks_db_update_item_db (bookmarks->db, item); |
964 | + |
965 | + midori_bookmarks_db_signal_update_item (bookmarks, item); |
966 | +} |
967 | + |
968 | +/** |
969 | + * midori_bookmarks_db_remove_item: |
970 | + * @bookmarks: the main bookmark array |
971 | + * @item: #KatzeItem the item to remove |
972 | + * |
973 | + * Removes the @item from the bookmark data base. |
974 | + * |
975 | + * Since: 0.5.2 |
976 | + **/ |
977 | +void |
978 | +midori_bookmarks_db_remove_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) |
979 | +{ |
980 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
981 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
982 | + g_return_if_fail (katze_item_get_meta_string (item, "id")); |
983 | + g_return_if_fail (0 != katze_item_get_meta_integer (item, "id")); |
984 | + |
985 | + midori_bookmarks_db_remove_item_recursive (item, bookmarks); |
986 | + midori_bookmarks_db_remove_item_db (bookmarks->db, item); |
987 | + |
988 | + katze_array_remove_item (KATZE_ARRAY (bookmarks), item); |
989 | } |
990 | |
991 | #define _APPEND_TO_SQL_ERRORMSG(custom_errmsg) \ |
992 | @@ -237,8 +696,8 @@ |
993 | g_string_append (errmsg_str, custom_errmsg); \ |
994 | } while (0) |
995 | |
996 | -gboolean |
997 | -midori_bookmarks_import_from_old_db (sqlite3* db, |
998 | +static gboolean |
999 | +midori_bookmarks_db_import_from_old_db (sqlite3* db, |
1000 | const gchar* oldfile, |
1001 | gchar** errmsg) |
1002 | { |
1003 | @@ -293,8 +752,24 @@ |
1004 | } |
1005 | #undef _APPEND_TO_SQL_ERRORMSG |
1006 | |
1007 | -KatzeArray* |
1008 | -midori_bookmarks_new (char** errmsg) |
1009 | +static void |
1010 | +midori_bookmarks_db_dbtracer (void* dummy, |
1011 | + const char* query) |
1012 | +{ |
1013 | + g_printerr ("%s\n", query); |
1014 | +} |
1015 | + |
1016 | +/** |
1017 | + * midori_bookmarks_db_new: |
1018 | + * |
1019 | + * Initializes the bookmark data base. |
1020 | + * |
1021 | + * Returns: the main bookmarks array |
1022 | + * |
1023 | + * Since: 0.5.2 |
1024 | + **/ |
1025 | +MidoriBookmarksDb* |
1026 | +midori_bookmarks_db_new (char** errmsg) |
1027 | { |
1028 | sqlite3* db; |
1029 | gchar* oldfile; |
1030 | @@ -304,6 +779,7 @@ |
1031 | gchar* sql_errmsg = NULL; |
1032 | gchar* import_errmsg = NULL; |
1033 | KatzeArray* array; |
1034 | + MidoriBookmarksDb* bookmarks; |
1035 | |
1036 | g_return_val_if_fail (errmsg != NULL, NULL); |
1037 | |
1038 | @@ -321,7 +797,7 @@ |
1039 | } |
1040 | |
1041 | if (midori_debug ("bookmarks")) |
1042 | - sqlite3_trace (db, midori_bookmarks_dbtracer, NULL); |
1043 | + sqlite3_trace (db, midori_bookmarks_db_dbtracer, NULL); |
1044 | |
1045 | create_stmt = /* Table structure */ |
1046 | "CREATE TABLE IF NOT EXISTS bookmarks " |
1047 | @@ -442,7 +918,7 @@ |
1048 | |
1049 | if (oldfile_exists) |
1050 | /* import from old db */ |
1051 | - if (!midori_bookmarks_import_from_old_db (db, oldfile, &import_errmsg)) |
1052 | + if (!midori_bookmarks_db_import_from_old_db (db, oldfile, &import_errmsg)) |
1053 | { |
1054 | *errmsg = g_strdup_printf (_("Couldn't import from old database: %s\n"), |
1055 | import_errmsg ? import_errmsg : "(err = NULL)"); |
1056 | @@ -452,13 +928,11 @@ |
1057 | init_success: |
1058 | g_free (newfile); |
1059 | g_free (oldfile); |
1060 | - array = katze_array_new (KATZE_TYPE_ARRAY); |
1061 | - g_signal_connect (array, "add-item", |
1062 | - G_CALLBACK (midori_bookmarks_add_item_cb), db); |
1063 | - g_signal_connect (array, "remove-item", |
1064 | - G_CALLBACK (midori_bookmarks_remove_item_cb), db); |
1065 | - g_object_set_data (G_OBJECT (array), "db", db); |
1066 | - return array; |
1067 | + bookmarks = MIDORI_BOOKMARKS_DB (g_object_new (TYPE_MIDORI_BOOKMARKS_DB, NULL)); |
1068 | + bookmarks->db = db; |
1069 | + |
1070 | + g_object_set_data (G_OBJECT (bookmarks), "db", db); |
1071 | + return bookmarks; |
1072 | |
1073 | init_failed: |
1074 | g_free (newfile); |
1075 | @@ -470,40 +944,154 @@ |
1076 | return NULL; |
1077 | } |
1078 | |
1079 | +/** |
1080 | + * midori_bookmarks_db_on_quit: |
1081 | + * @bookmarks: the main bookmark array |
1082 | + * |
1083 | + * Delete the main bookmark array. |
1084 | + * |
1085 | + * Since: 0.5.2 |
1086 | + **/ |
1087 | void |
1088 | -midori_bookmarks_on_quit (KatzeArray* array) |
1089 | +midori_bookmarks_db_on_quit (MidoriBookmarksDb* bookmarks) |
1090 | { |
1091 | - g_return_if_fail (KATZE_IS_ARRAY (array)); |
1092 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
1093 | |
1094 | - sqlite3* db = g_object_get_data (G_OBJECT (array), "db"); |
1095 | - g_return_if_fail (db != NULL); |
1096 | - sqlite3_close (db); |
1097 | + g_object_unref (bookmarks); |
1098 | } |
1099 | |
1100 | +/** |
1101 | + * midori_bookmarks_db_import_array: |
1102 | + * @array: the main bookmark array |
1103 | + * @array: #KatzeArray containing the items to import |
1104 | + * @parentid: the id of folder |
1105 | + * |
1106 | + * Imports the items of @array as childs of the folder |
1107 | + * identfied by @parentid. |
1108 | + * |
1109 | + * Since: 0.5.2 |
1110 | + **/ |
1111 | void |
1112 | -midori_bookmarks_import_array (KatzeArray* bookmarks, |
1113 | +midori_bookmarks_db_import_array (MidoriBookmarksDb* bookmarks, |
1114 | KatzeArray* array, |
1115 | gint64 parentid) |
1116 | { |
1117 | GList* list; |
1118 | KatzeItem* item; |
1119 | |
1120 | - if (!bookmarks) |
1121 | - return; |
1122 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
1123 | + g_return_if_fail (KATZE_IS_ARRAY (array)); |
1124 | |
1125 | KATZE_ARRAY_FOREACH_ITEM_L (item, array, list) |
1126 | { |
1127 | katze_item_set_meta_integer (item, "parentid", parentid); |
1128 | - katze_array_add_item (bookmarks, item); |
1129 | - if (KATZE_IS_ARRAY (item)) |
1130 | - midori_bookmarks_import_array (bookmarks, KATZE_ARRAY (item), |
1131 | - katze_item_get_meta_integer(item, "id")); |
1132 | + midori_bookmarks_db_add_item (bookmarks, item); |
1133 | } |
1134 | g_list_free (list); |
1135 | } |
1136 | |
1137 | /** |
1138 | - * midori_array_query_recursive: |
1139 | + * midori_bookmarks_db_array_from_statement: |
1140 | + * @stmt: the sqlite returned statement |
1141 | + * @bookmarks: the database controller |
1142 | + * |
1143 | + * Internal function that populate a #KatzeArray by processing the @stmt |
1144 | + * rows identifying: |
1145 | + * a- if the item is already in memory |
1146 | + * in this case the item data is updated with retreived database content |
1147 | + * and the already existing item is populated in the returned #KatzeArray |
1148 | + * b- if the data is a folder |
1149 | + * a new #KatzeArray item is populated in the returned #KatzeArray and |
1150 | + * memorized for future use. |
1151 | + * c- if the data is a bookmark |
1152 | + * a new #KatzeItem item is populated in the returned #KatzeArray and |
1153 | + * memorized for furure use. |
1154 | + * |
1155 | + * Return value: the populated #KatzeArray |
1156 | + **/ |
1157 | +static KatzeArray* |
1158 | +midori_bookmarks_db_array_from_statement (sqlite3_stmt* stmt, |
1159 | + MidoriBookmarksDb* bookmarks) |
1160 | +{ |
1161 | + KatzeArray *array; |
1162 | + gint result; |
1163 | + gint cols; |
1164 | + |
1165 | + array = katze_array_new (KATZE_TYPE_ITEM); |
1166 | + cols = sqlite3_column_count (stmt); |
1167 | + |
1168 | + while ((result = sqlite3_step (stmt)) == SQLITE_ROW) |
1169 | + { |
1170 | + gint i; |
1171 | + KatzeItem* item; |
1172 | + KatzeItem* found; |
1173 | + |
1174 | + item = katze_item_new (); |
1175 | + for (i = 0; i < cols; i++) |
1176 | + katze_item_set_value_from_column (stmt, i, item); |
1177 | + |
1178 | + if (NULL != (found = g_hash_table_lookup (bookmarks->all_items, item))) |
1179 | + { |
1180 | + for (i = 0; i < cols; i++) |
1181 | + katze_item_set_value_from_column (stmt, i, found); |
1182 | + |
1183 | + g_object_unref (item); |
1184 | + |
1185 | + item = found; |
1186 | + } |
1187 | + else if (KATZE_ITEM_IS_FOLDER (item)) |
1188 | + { |
1189 | + g_object_unref (item); |
1190 | + |
1191 | + item = KATZE_ITEM (katze_array_new (KATZE_TYPE_ITEM)); |
1192 | + |
1193 | + for (i = 0; i < cols; i++) |
1194 | + katze_item_set_value_from_column (stmt, i, item); |
1195 | + |
1196 | + g_object_ref (item); |
1197 | + g_hash_table_insert (bookmarks->all_items, item, item); |
1198 | + } |
1199 | + else |
1200 | + { |
1201 | + g_object_ref (item); |
1202 | + g_hash_table_insert (bookmarks->all_items, item, item); |
1203 | + } |
1204 | + |
1205 | + katze_array_add_item (array, item); |
1206 | + } |
1207 | + |
1208 | + sqlite3_clear_bindings (stmt); |
1209 | + sqlite3_reset (stmt); |
1210 | + return array; |
1211 | +} |
1212 | + |
1213 | +/** |
1214 | + * midori_bookmarks_db_array_from_sqlite: |
1215 | + * @array: the main bookmark array |
1216 | + * @sqlcmd: the sqlcmd to execute |
1217 | + * |
1218 | + * Internal function that process the requested @sqlcmd. |
1219 | + * |
1220 | + * Return value: a #KatzeArray on success, %NULL otherwise |
1221 | + **/ |
1222 | +static KatzeArray* |
1223 | +midori_bookmarks_db_array_from_sqlite (MidoriBookmarksDb* bookmarks, |
1224 | + const gchar* sqlcmd) |
1225 | +{ |
1226 | + sqlite3_stmt* stmt; |
1227 | + gint result; |
1228 | + |
1229 | + g_return_val_if_fail (bookmarks->db != NULL, NULL); |
1230 | + |
1231 | + result = sqlite3_prepare_v2 (bookmarks->db, sqlcmd, -1, &stmt, NULL); |
1232 | + if (result != SQLITE_OK) |
1233 | + return NULL; |
1234 | + |
1235 | + return midori_bookmarks_db_array_from_statement (stmt, bookmarks); |
1236 | +} |
1237 | + |
1238 | +/** |
1239 | + * midori_bookmarks_db_query_recursive: |
1240 | * @array: the main bookmark array |
1241 | * @fields: comma separated list of fields |
1242 | * @condition: condition, like "folder = '%q'" |
1243 | @@ -514,38 +1102,35 @@ |
1244 | * |
1245 | * Return value: a #KatzeArray on success, %NULL otherwise |
1246 | * |
1247 | - * Since: 0.4.4 |
1248 | + * Since: 0.5.2 |
1249 | **/ |
1250 | KatzeArray* |
1251 | -midori_array_query_recursive (KatzeArray* bookmarks, |
1252 | - const gchar* fields, |
1253 | - const gchar* condition, |
1254 | - const gchar* value, |
1255 | - gboolean recursive) |
1256 | +midori_bookmarks_db_query_recursive (MidoriBookmarksDb* bookmarks, |
1257 | + const gchar* fields, |
1258 | + const gchar* condition, |
1259 | + const gchar* value, |
1260 | + gboolean recursive) |
1261 | { |
1262 | - sqlite3* db; |
1263 | gchar* sqlcmd; |
1264 | char* sqlcmd_value; |
1265 | KatzeArray* array; |
1266 | KatzeItem* item; |
1267 | GList* list; |
1268 | |
1269 | - g_return_val_if_fail (KATZE_IS_ARRAY (bookmarks), NULL); |
1270 | + g_return_val_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks), NULL); |
1271 | g_return_val_if_fail (fields, NULL); |
1272 | g_return_val_if_fail (condition, NULL); |
1273 | - db = g_object_get_data (G_OBJECT (bookmarks), "db"); |
1274 | - g_return_val_if_fail (db != NULL, NULL); |
1275 | |
1276 | sqlcmd = g_strdup_printf ("SELECT %s FROM bookmarks WHERE %s " |
1277 | "ORDER BY (uri='') ASC, title DESC", fields, condition); |
1278 | if (strstr (condition, "%q")) |
1279 | { |
1280 | sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : ""); |
1281 | - array = katze_array_from_sqlite (db, sqlcmd_value); |
1282 | + array = midori_bookmarks_db_array_from_sqlite (bookmarks, sqlcmd_value); |
1283 | sqlite3_free (sqlcmd_value); |
1284 | } |
1285 | else |
1286 | - array = katze_array_from_sqlite (db, sqlcmd); |
1287 | + array = midori_bookmarks_db_array_from_sqlite (bookmarks, sqlcmd); |
1288 | g_free (sqlcmd); |
1289 | |
1290 | if (!recursive) |
1291 | @@ -556,9 +1141,9 @@ |
1292 | if (KATZE_ITEM_IS_FOLDER (item)) |
1293 | { |
1294 | gchar* parentid = g_strdup_printf ("%" G_GINT64_FORMAT, |
1295 | - katze_item_get_meta_integer (item, "id")); |
1296 | - KatzeArray* subarray = midori_array_query_recursive (bookmarks, |
1297 | - fields, "parentid=%q", parentid, TRUE); |
1298 | + katze_item_get_meta_integer (item, "id")); |
1299 | + KatzeArray* subarray = midori_bookmarks_db_query_recursive (bookmarks, |
1300 | + fields, "parentid=%q", parentid, TRUE); |
1301 | KatzeItem* subitem; |
1302 | GList* sublist; |
1303 | |
1304 | @@ -576,21 +1161,21 @@ |
1305 | } |
1306 | |
1307 | static gint64 |
1308 | -count_from_sqlite (sqlite3* db, |
1309 | - const gchar* sqlcmd) |
1310 | +midori_bookmarks_db_count_from_sqlite (sqlite3* db, |
1311 | + const gchar* sqlcmd) |
1312 | { |
1313 | gint64 count = -1; |
1314 | sqlite3_stmt* stmt; |
1315 | gint result; |
1316 | - |
1317 | + |
1318 | result = sqlite3_prepare_v2 (db, sqlcmd, -1, &stmt, NULL); |
1319 | if (result != SQLITE_OK) |
1320 | return -1; |
1321 | |
1322 | g_assert (sqlite3_column_count (stmt) == 1); |
1323 | - |
1324 | + |
1325 | if ((result = sqlite3_step (stmt)) == SQLITE_ROW) |
1326 | - count = sqlite3_column_int64(stmt, 0); |
1327 | + count = sqlite3_column_int64(stmt, 0); |
1328 | |
1329 | sqlite3_clear_bindings (stmt); |
1330 | sqlite3_reset (stmt); |
1331 | @@ -599,14 +1184,13 @@ |
1332 | } |
1333 | |
1334 | static gint64 |
1335 | -midori_array_count_recursive_by_id (KatzeArray* bookmarks, |
1336 | - const gchar* condition, |
1337 | - const gchar* value, |
1338 | - gint64 id, |
1339 | - gboolean recursive) |
1340 | +midori_bookmarks_db_count_recursive_by_id (MidoriBookmarksDb* bookmarks, |
1341 | + const gchar* condition, |
1342 | + const gchar* value, |
1343 | + gint64 id, |
1344 | + gboolean recursive) |
1345 | { |
1346 | gint64 count = -1; |
1347 | - sqlite3* db; |
1348 | gchar* sqlcmd; |
1349 | char* sqlcmd_value; |
1350 | sqlite3_stmt* stmt; |
1351 | @@ -615,30 +1199,29 @@ |
1352 | GList* iter_ids; |
1353 | |
1354 | g_return_val_if_fail (condition, -1); |
1355 | - g_return_val_if_fail (KATZE_IS_ARRAY (bookmarks), -1); |
1356 | - db = g_object_get_data (G_OBJECT (bookmarks), "db"); |
1357 | - g_return_val_if_fail (db != NULL, -1); |
1358 | + g_return_val_if_fail (MIDORI_BOOKMARKS_DB (bookmarks), -1); |
1359 | + g_return_val_if_fail (bookmarks->db != NULL, -1); |
1360 | |
1361 | g_assert(!strstr("parentid", condition)); |
1362 | |
1363 | if (id > 0) |
1364 | - sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks " |
1365 | - "WHERE parentid = %" G_GINT64_FORMAT " AND %s", |
1366 | - id, |
1367 | - condition); |
1368 | + sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks " |
1369 | + "WHERE parentid = %" G_GINT64_FORMAT " AND %s", |
1370 | + id, |
1371 | + condition); |
1372 | else |
1373 | - sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks " |
1374 | - "WHERE parentid IS NULL AND %s ", |
1375 | - condition); |
1376 | + sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks " |
1377 | + "WHERE parentid IS NULL AND %s ", |
1378 | + condition); |
1379 | |
1380 | if (strstr (condition, "%q")) |
1381 | { |
1382 | sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : ""); |
1383 | - count = count_from_sqlite (db, sqlcmd_value); |
1384 | + count = midori_bookmarks_db_count_from_sqlite (bookmarks->db, sqlcmd_value); |
1385 | sqlite3_free (sqlcmd_value); |
1386 | } |
1387 | else |
1388 | - count = count_from_sqlite (db, sqlcmd); |
1389 | + count = midori_bookmarks_db_count_from_sqlite (bookmarks->db, sqlcmd); |
1390 | |
1391 | g_free (sqlcmd); |
1392 | |
1393 | @@ -648,28 +1231,28 @@ |
1394 | ids = NULL; |
1395 | |
1396 | if (id > 0) |
1397 | - sqlcmd_value = sqlite3_mprintf ( |
1398 | - "SELECT id FROM bookmarks " |
1399 | - "WHERE parentid = %" G_GINT64_FORMAT " AND uri = ''", id); |
1400 | + sqlcmd_value = sqlite3_mprintf ( |
1401 | + "SELECT id FROM bookmarks " |
1402 | + "WHERE parentid = %" G_GINT64_FORMAT " AND uri = ''", id); |
1403 | else |
1404 | - sqlcmd_value = sqlite3_mprintf ( |
1405 | - "SELECT id FROM bookmarks " |
1406 | - "WHERE parentid IS NULL AND uri = ''"); |
1407 | + sqlcmd_value = sqlite3_mprintf ( |
1408 | + "SELECT id FROM bookmarks " |
1409 | + "WHERE parentid IS NULL AND uri = ''"); |
1410 | |
1411 | - if (sqlite3_prepare_v2 (db, sqlcmd_value, -1, &stmt, NULL) == SQLITE_OK) |
1412 | + if (sqlite3_prepare_v2 (bookmarks->db, sqlcmd_value, -1, &stmt, NULL) == SQLITE_OK) |
1413 | { |
1414 | - g_assert (sqlite3_column_count (stmt) == 1); |
1415 | - |
1416 | - if ((result = sqlite3_step (stmt)) == SQLITE_ROW) |
1417 | - { |
1418 | - gint64* pid = g_new (gint64, 1); |
1419 | - |
1420 | - *pid = sqlite3_column_int64(stmt, 0); |
1421 | - ids = g_list_append (ids, pid); |
1422 | - } |
1423 | - |
1424 | - sqlite3_clear_bindings (stmt); |
1425 | - sqlite3_reset (stmt); |
1426 | + g_assert (sqlite3_column_count (stmt) == 1); |
1427 | + |
1428 | + if ((result = sqlite3_step (stmt)) == SQLITE_ROW) |
1429 | + { |
1430 | + gint64* pid = g_new (gint64, 1); |
1431 | + |
1432 | + *pid = sqlite3_column_int64(stmt, 0); |
1433 | + ids = g_list_append (ids, pid); |
1434 | + } |
1435 | + |
1436 | + sqlite3_clear_bindings (stmt); |
1437 | + sqlite3_reset (stmt); |
1438 | } |
1439 | |
1440 | sqlite3_free (sqlcmd_value); |
1441 | @@ -677,29 +1260,29 @@ |
1442 | iter_ids = ids; |
1443 | while (iter_ids) |
1444 | { |
1445 | - gint64 sub_count = midori_array_count_recursive_by_id (bookmarks, |
1446 | - condition, |
1447 | - value, |
1448 | - *(gint64*)(iter_ids->data), |
1449 | - recursive); |
1450 | - |
1451 | - if (sub_count < 0) |
1452 | - { |
1453 | - g_list_free_full (ids, g_free); |
1454 | - return -1; |
1455 | - } |
1456 | - |
1457 | - count += sub_count; |
1458 | - iter_ids = g_list_next (iter_ids); |
1459 | + gint64 sub_count = midori_bookmarks_db_count_recursive_by_id (bookmarks, |
1460 | + condition, |
1461 | + value, |
1462 | + *(gint64*)(iter_ids->data), |
1463 | + recursive); |
1464 | + |
1465 | + if (sub_count < 0) |
1466 | + { |
1467 | + g_list_free_full (ids, g_free); |
1468 | + return -1; |
1469 | + } |
1470 | + |
1471 | + count += sub_count; |
1472 | + iter_ids = g_list_next (iter_ids); |
1473 | } |
1474 | - |
1475 | + |
1476 | g_list_free_full (ids, g_free); |
1477 | return count; |
1478 | } |
1479 | |
1480 | /** |
1481 | - * midori_array_count_recursive: |
1482 | - * @array: the main bookmark array |
1483 | + * midori_bookmarks_db_count_recursive: |
1484 | + * @bookmarks: the main bookmark array |
1485 | * @condition: condition, like "folder = '%q'" |
1486 | * @value: a value to be inserted if @condition contains %q |
1487 | * @recursive: if %TRUE include children |
1488 | @@ -709,19 +1292,19 @@ |
1489 | * Since: 0.5.2 |
1490 | **/ |
1491 | gint64 |
1492 | -midori_array_count_recursive (KatzeArray* bookmarks, |
1493 | - const gchar* condition, |
1494 | - const gchar* value, |
1495 | - KatzeItem* folder, |
1496 | - gboolean recursive) |
1497 | +midori_bookmarks_db_count_recursive (MidoriBookmarksDb* bookmarks, |
1498 | + const gchar* condition, |
1499 | + const gchar* value, |
1500 | + KatzeItem* folder, |
1501 | + gboolean recursive) |
1502 | { |
1503 | gint64 id = -1; |
1504 | |
1505 | g_return_val_if_fail (!folder || KATZE_ITEM_IS_FOLDER (folder), -1); |
1506 | - |
1507 | + |
1508 | id = folder ? katze_item_get_meta_integer (folder, "id") : 0; |
1509 | |
1510 | - return midori_array_count_recursive_by_id (bookmarks, condition, |
1511 | - value, id, |
1512 | - recursive); |
1513 | + return midori_bookmarks_db_count_recursive_by_id (bookmarks, condition, |
1514 | + value, id, |
1515 | + recursive); |
1516 | } |
1517 | |
1518 | === modified file 'midori/midori-bookmarks-db.h' |
1519 | --- midori/midori-bookmarks-db.h 2013-09-08 10:53:32 +0000 |
1520 | +++ midori/midori-bookmarks-db.h 2013-09-17 21:28:04 +0000 |
1521 | @@ -16,33 +16,60 @@ |
1522 | #include <sqlite3.h> |
1523 | #include <katze/katze.h> |
1524 | |
1525 | -KatzeArray* |
1526 | -midori_bookmarks_new (char** errmsg); |
1527 | - |
1528 | -void |
1529 | -midori_bookmarks_on_quit (KatzeArray* array); |
1530 | - |
1531 | -void |
1532 | -midori_array_update_item (KatzeArray* bookmarks, KatzeItem* item); |
1533 | - |
1534 | -void |
1535 | -midori_bookmarks_import_array (KatzeArray* bookmarks, |
1536 | - KatzeArray* array, |
1537 | - gint64 parentid); |
1538 | - |
1539 | -KatzeArray* |
1540 | -midori_array_query_recursive (KatzeArray* bookmarks, |
1541 | - const gchar* fields, |
1542 | - const gchar* condition, |
1543 | - const gchar* value, |
1544 | - gboolean recursive); |
1545 | +G_BEGIN_DECLS |
1546 | + |
1547 | +#define TYPE_MIDORI_BOOKMARKS_DB \ |
1548 | + (midori_bookmarks_db_get_type ()) |
1549 | +#define MIDORI_BOOKMARKS_DB(obj) \ |
1550 | + (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDb)) |
1551 | +#define MIDORI_BOOKMARKS_DB_CLASS(klass) \ |
1552 | + (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDbClass)) |
1553 | +#define IS_MIDORI_BOOKMARKS_DB(obj) \ |
1554 | + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MIDORI_BOOKMARKS_DB)) |
1555 | +#define IS_MIDORI_BOOKMARKS_DB_CLASS(klass) \ |
1556 | + (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MIDORI_BOOKMARKS_DB)) |
1557 | +#define MIDORI_BOOKMARKS_DB_GET_CLASS(obj) \ |
1558 | + (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDbClass)) |
1559 | + |
1560 | +typedef struct _MidoriBookmarksDb MidoriBookmarksDb; |
1561 | +typedef struct _MidoriBookmarksDbClass MidoriBookmarksDbClass; |
1562 | + |
1563 | +GType |
1564 | +midori_bookmarks_db_get_type (void) G_GNUC_CONST; |
1565 | + |
1566 | +MidoriBookmarksDb* |
1567 | +midori_bookmarks_db_new (char** errmsg); |
1568 | + |
1569 | +void |
1570 | +midori_bookmarks_db_on_quit (MidoriBookmarksDb* array); |
1571 | + |
1572 | +void |
1573 | +midori_bookmarks_db_add_item (MidoriBookmarksDb* bookmarks, KatzeItem* item); |
1574 | + |
1575 | +void |
1576 | +midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, KatzeItem* item); |
1577 | + |
1578 | +void |
1579 | +midori_bookmarks_db_remove_item (MidoriBookmarksDb* bookmarks, KatzeItem* item); |
1580 | + |
1581 | +void |
1582 | +midori_bookmarks_db_import_array (MidoriBookmarksDb* bookmarks, |
1583 | + KatzeArray* array, |
1584 | + gint64 parentid); |
1585 | + |
1586 | +KatzeArray* |
1587 | +midori_bookmarks_db_query_recursive (MidoriBookmarksDb* bookmarks, |
1588 | + const gchar* fields, |
1589 | + const gchar* condition, |
1590 | + const gchar* value, |
1591 | + gboolean recursive); |
1592 | |
1593 | gint64 |
1594 | -midori_array_count_recursive (KatzeArray* bookmarks, |
1595 | - const gchar* condition, |
1596 | - const gchar* value, |
1597 | - KatzeItem* folder, |
1598 | - gboolean recursive); |
1599 | +midori_bookmarks_db_count_recursive (MidoriBookmarksDb* bookmarks, |
1600 | + const gchar* condition, |
1601 | + const gchar* value, |
1602 | + KatzeItem* folder, |
1603 | + gboolean recursive); |
1604 | |
1605 | gint64 |
1606 | midori_bookmarks_insert_item_db (sqlite3* db, |
1607 | |
1608 | === modified file 'midori/midori-browser.c' |
1609 | --- midori/midori-browser.c 2013-09-16 22:00:41 +0000 |
1610 | +++ midori/midori-browser.c 2013-09-17 21:28:04 +0000 |
1611 | @@ -87,7 +87,7 @@ |
1612 | |
1613 | MidoriWebSettings* settings; |
1614 | KatzeArray* proxy_array; |
1615 | - KatzeArray* bookmarks; |
1616 | + MidoriBookmarksDb* bookmarks; |
1617 | KatzeArray* trash; |
1618 | KatzeArray* search_engines; |
1619 | KatzeArray* history; |
1620 | @@ -195,8 +195,8 @@ |
1621 | GtkToolbarStyle style); |
1622 | |
1623 | static void |
1624 | -midori_browser_set_bookmarks (MidoriBrowser* browser, |
1625 | - KatzeArray* bookmarks); |
1626 | +midori_browser_set_bookmarks (MidoriBrowser* browser, |
1627 | + MidoriBookmarksDb* bookmarks); |
1628 | |
1629 | static void |
1630 | midori_browser_add_speed_dial (MidoriBrowser* browser); |
1631 | @@ -863,7 +863,7 @@ |
1632 | } |
1633 | |
1634 | static GtkWidget* |
1635 | -midori_bookmark_folder_button_new (KatzeArray* array, |
1636 | +midori_bookmark_folder_button_new (MidoriBookmarksDb* array, |
1637 | gint64 selected_parentid) |
1638 | { |
1639 | GtkTreeStore* model; |
1640 | @@ -1231,18 +1231,9 @@ |
1641 | katze_item_set_meta_integer (bookmark, "parentid", selected); |
1642 | |
1643 | if (new_bookmark) |
1644 | - katze_array_add_item (browser->bookmarks, bookmark); |
1645 | + midori_bookmarks_db_add_item (browser->bookmarks, bookmark); |
1646 | else |
1647 | - { |
1648 | - midori_array_update_item (browser->bookmarks, bookmark); |
1649 | - midori_browser_update_history (bookmark, "bookmark", "modify"); |
1650 | - |
1651 | - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_toolbar))) |
1652 | - if (!gtk_widget_get_visible (browser->bookmarkbar)) |
1653 | - _action_set_active (browser, "Bookmarkbar", TRUE); |
1654 | - if (gtk_widget_get_visible (browser->bookmarkbar)) |
1655 | - midori_bookmarkbar_populate (browser); |
1656 | - } |
1657 | + midori_bookmarks_db_update_item (browser->bookmarks, bookmark); |
1658 | |
1659 | return_status = TRUE; |
1660 | } |
1661 | @@ -2545,7 +2536,7 @@ |
1662 | "bookmarks", |
1663 | "Bookmarks", |
1664 | "The bookmarks folder, containing all bookmarks", |
1665 | - KATZE_TYPE_ARRAY, |
1666 | + TYPE_MIDORI_BOOKMARKS_DB, |
1667 | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); |
1668 | |
1669 | /** |
1670 | @@ -3273,8 +3264,8 @@ |
1671 | else |
1672 | condition = "parentid = %q"; |
1673 | |
1674 | - bookmarks = midori_array_query_recursive (browser->bookmarks, |
1675 | - "id, title, parentid, uri, app, pos_panel, pos_bar", condition, id, FALSE); |
1676 | + bookmarks = midori_bookmarks_db_query_recursive (browser->bookmarks, |
1677 | + "id, title, parentid, uri, app, pos_panel, pos_bar", condition, id, FALSE); |
1678 | if (!bookmarks) |
1679 | return FALSE; |
1680 | |
1681 | @@ -4308,7 +4299,7 @@ |
1682 | KatzeItem* item; |
1683 | |
1684 | item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); |
1685 | - katze_array_remove_item (browser->bookmarks, item); |
1686 | + midori_bookmarks_db_remove_item (browser->bookmarks, item); |
1687 | } |
1688 | |
1689 | static void |
1690 | @@ -4320,7 +4311,7 @@ |
1691 | MidoriContextAction* menu = midori_context_action_new ("BookmarkContextMenu", NULL, NULL, NULL); |
1692 | if (KATZE_ITEM_IS_FOLDER (item)) |
1693 | { |
1694 | - gint child_bookmarks_count = midori_array_count_recursive (browser->bookmarks, |
1695 | + gint child_bookmarks_count = midori_bookmarks_db_count_recursive (browser->bookmarks, |
1696 | "uri <> ''", NULL, item, FALSE); |
1697 | |
1698 | GtkAction* action = gtk_action_new ("BookmarkOpenAllTabs", _("Open all in _Tabs"), NULL, STOCK_TAB_NEW); |
1699 | @@ -4590,8 +4581,7 @@ |
1700 | if (error) |
1701 | g_error_free (error); |
1702 | } |
1703 | - midori_bookmarks_import_array (browser->bookmarks, bookmarks, selected); |
1704 | - |
1705 | + midori_bookmarks_db_import_array (browser->bookmarks, bookmarks, selected); |
1706 | g_object_unref (bookmarks); |
1707 | g_free (path); |
1708 | } |
1709 | @@ -4645,7 +4635,7 @@ |
1710 | return; |
1711 | |
1712 | error = NULL; |
1713 | - bookmarks = midori_array_query_recursive (browser->bookmarks, |
1714 | + bookmarks = midori_bookmarks_db_query_recursive (browser->bookmarks, |
1715 | "*", "parentid IS NULL", NULL, TRUE); |
1716 | if (!midori_array_to_file (bookmarks, path, format, &error)) |
1717 | { |
1718 | @@ -7060,6 +7050,16 @@ |
1719 | } |
1720 | |
1721 | static void |
1722 | +midori_bookmarkbar_update_item_cb (KatzeArray* bookmarks, |
1723 | + KatzeItem* item, |
1724 | + MidoriBrowser* browser) |
1725 | +{ |
1726 | + if (gtk_widget_get_visible (browser->bookmarkbar)) |
1727 | + midori_bookmarkbar_populate (browser); |
1728 | + midori_browser_update_history (item, "bookmark", "modify"); |
1729 | +} |
1730 | + |
1731 | +static void |
1732 | midori_bookmarkbar_remove_item_cb (KatzeArray* bookmarks, |
1733 | KatzeItem* item, |
1734 | MidoriBrowser* browser) |
1735 | @@ -7091,8 +7091,8 @@ |
1736 | gtk_toolbar_insert (GTK_TOOLBAR (browser->bookmarkbar), |
1737 | gtk_separator_tool_item_new (), -1); |
1738 | |
1739 | - array = midori_array_query_recursive (browser->bookmarks, |
1740 | - "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "toolbar = 1", NULL, FALSE); |
1741 | + array = midori_bookmarks_db_query_recursive (browser->bookmarks, |
1742 | + "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "toolbar = 1", NULL, FALSE); |
1743 | if (!array) |
1744 | { |
1745 | _action_set_sensitive (browser, "BookmarkAdd", FALSE); |
1746 | @@ -7132,7 +7132,7 @@ |
1747 | |
1748 | static void |
1749 | midori_browser_set_bookmarks (MidoriBrowser* browser, |
1750 | - KatzeArray* bookmarks) |
1751 | + MidoriBookmarksDb* bookmarks) |
1752 | { |
1753 | MidoriWebSettings* settings; |
1754 | |
1755 | @@ -7141,6 +7141,8 @@ |
1756 | g_signal_handlers_disconnect_by_func (browser->bookmarks, |
1757 | midori_bookmarkbar_add_item_cb, browser); |
1758 | g_signal_handlers_disconnect_by_func (browser->bookmarks, |
1759 | + midori_bookmarkbar_update_item_cb, browser); |
1760 | + g_signal_handlers_disconnect_by_func (browser->bookmarks, |
1761 | midori_bookmarkbar_remove_item_cb, browser); |
1762 | } |
1763 | |
1764 | @@ -7174,6 +7176,8 @@ |
1765 | g_object_notify (G_OBJECT (settings), "show-bookmarkbar"); |
1766 | g_signal_connect_after (bookmarks, "add-item", |
1767 | G_CALLBACK (midori_bookmarkbar_add_item_cb), browser); |
1768 | + g_signal_connect_after (bookmarks, "update-item", |
1769 | + G_CALLBACK (midori_bookmarkbar_update_item_cb), browser); |
1770 | g_signal_connect_after (bookmarks, "remove-item", |
1771 | G_CALLBACK (midori_bookmarkbar_remove_item_cb), browser); |
1772 | } |
1773 | |
1774 | === modified file 'midori/midori-frontend.c' |
1775 | --- midori/midori-frontend.c 2013-09-08 11:09:40 +0000 |
1776 | +++ midori/midori-frontend.c 2013-09-17 21:28:04 +0000 |
1777 | @@ -487,9 +487,9 @@ |
1778 | } |
1779 | g_free (uri); |
1780 | |
1781 | - KatzeArray* bookmarks; |
1782 | + MidoriBookmarksDb* bookmarks; |
1783 | gchar* errmsg = NULL; |
1784 | - if (!(bookmarks = midori_bookmarks_new (&errmsg))) |
1785 | + if (!(bookmarks = midori_bookmarks_db_new (&errmsg))) |
1786 | { |
1787 | g_string_append_printf (error_messages, |
1788 | _("Bookmarks couldn't be loaded: %s\n"), errmsg); |
1789 | @@ -596,11 +596,11 @@ |
1790 | midori_normal_app_on_quit (MidoriApp* app) |
1791 | { |
1792 | MidoriWebSettings* settings = katze_object_get_object (app, "settings"); |
1793 | - KatzeArray* bookmarks = katze_object_get_object (app, "bookmarks"); |
1794 | + MidoriBookmarksDb* bookmarks = katze_object_get_object (app, "bookmarks"); |
1795 | KatzeArray* history = katze_object_get_object (app, "history"); |
1796 | |
1797 | g_object_notify (G_OBJECT (settings), "load-on-startup"); |
1798 | - midori_bookmarks_on_quit (bookmarks); |
1799 | + midori_bookmarks_db_on_quit (bookmarks); |
1800 | midori_history_on_quit (history, settings); |
1801 | midori_private_data_on_quit (settings); |
1802 | |
1803 | |
1804 | === modified file 'panels/midori-bookmarks.c' |
1805 | --- panels/midori-bookmarks.c 2013-09-08 11:09:40 +0000 |
1806 | +++ panels/midori-bookmarks.c 2013-09-17 21:28:04 +0000 |
1807 | @@ -45,7 +45,7 @@ |
1808 | GtkWidget* delete; |
1809 | GtkWidget* treeview; |
1810 | MidoriApp* app; |
1811 | - KatzeArray* array; |
1812 | + MidoriBookmarksDb* bookmarks_db; |
1813 | |
1814 | gint filter_timeout; |
1815 | gchar* filter; |
1816 | @@ -125,6 +125,7 @@ |
1817 | return STOCK_BOOKMARKS; |
1818 | } |
1819 | |
1820 | +#if 0 /* Make sure the following function is never used */ |
1821 | /* TODO: Function never used */ |
1822 | void |
1823 | midori_bookmarks_export_array_db (sqlite3* db, |
1824 | @@ -138,7 +139,7 @@ |
1825 | gchar* parent_id; |
1826 | |
1827 | parent_id = g_strdup_printf ("%" G_GINT64_FORMAT, parentid); |
1828 | - if (!(root_array = midori_array_query_recursive (array, "*", "parentid = %q", parent_id, FALSE))) |
1829 | + if (!(root_array = midori_bookmarks_db_query_recursive (array, "*", "parentid = %q", parent_id, FALSE))) |
1830 | { |
1831 | g_free (parent_id); |
1832 | return; |
1833 | @@ -160,6 +161,7 @@ |
1834 | g_free (parent_id); |
1835 | g_list_free (list); |
1836 | } |
1837 | +#endif /* 0 */ |
1838 | |
1839 | static KatzeArray* |
1840 | midori_bookmarks_read_from_db (MidoriBookmarks* bookmarks, |
1841 | @@ -169,21 +171,21 @@ |
1842 | KatzeArray* array; |
1843 | |
1844 | if (keyword && *keyword) |
1845 | - array = midori_array_query_recursive (bookmarks->array, |
1846 | - "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "title LIKE '%%%q%%'", keyword, FALSE); |
1847 | + array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db, |
1848 | + "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "title LIKE '%%%q%%'", keyword, FALSE); |
1849 | else |
1850 | { |
1851 | if (parentid > 0) |
1852 | { |
1853 | gchar* parent_id = g_strdup_printf ("%" G_GINT64_FORMAT, parentid); |
1854 | - array = midori_array_query_recursive (bookmarks->array, |
1855 | - "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid = %q", parent_id, FALSE); |
1856 | + array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db, |
1857 | + "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid = %q", parent_id, FALSE); |
1858 | |
1859 | g_free (parent_id); |
1860 | } |
1861 | else |
1862 | - array = midori_array_query_recursive (bookmarks->array, |
1863 | - "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid IS NULL", NULL, FALSE); |
1864 | + array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db, |
1865 | + "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid IS NULL", NULL, FALSE); |
1866 | } |
1867 | return array ? array : katze_array_new (KATZE_TYPE_ITEM); |
1868 | } |
1869 | @@ -274,9 +276,9 @@ |
1870 | else |
1871 | parentid = 0; |
1872 | |
1873 | - katze_array_remove_item (bookmarks->array, item); |
1874 | katze_item_set_meta_integer (item, "parentid", parentid); |
1875 | - katze_array_add_item (bookmarks->array, item); |
1876 | + |
1877 | + midori_bookmarks_db_update_item (bookmarks->bookmarks_db, item); |
1878 | |
1879 | g_object_unref (item); |
1880 | if (new_parent) |
1881 | @@ -416,9 +418,9 @@ |
1882 | |
1883 | if (KATZE_ITEM_IS_FOLDER (item)) |
1884 | { |
1885 | - gint child_folders_count = midori_array_count_recursive (bookmarks->array, |
1886 | + gint child_folders_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1887 | "uri = ''", NULL, item, FALSE); |
1888 | - gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array, |
1889 | + gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1890 | "uri <> ''", NULL, item, FALSE); |
1891 | gchar* child_folders_str = midori_bookmarks_statusbar_subfolders_str (child_folders_count); |
1892 | gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count); |
1893 | @@ -451,9 +453,9 @@ |
1894 | } |
1895 | else |
1896 | { |
1897 | - gint child_folders_count = midori_array_count_recursive (bookmarks->array, |
1898 | + gint child_folders_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1899 | "uri = ''", NULL, NULL, FALSE); |
1900 | - gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array, |
1901 | + gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1902 | "uri <> ''", NULL, NULL, FALSE); |
1903 | gchar* child_folders_str = midori_bookmarks_statusbar_subfolders_str (child_folders_count); |
1904 | gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count); |
1905 | @@ -499,10 +501,10 @@ |
1906 | |
1907 | /* Manually remove the iter and block clearing the treeview */ |
1908 | gtk_tree_store_remove (GTK_TREE_STORE (model), &iter); |
1909 | - g_signal_handlers_block_by_func (bookmarks->array, |
1910 | + g_signal_handlers_block_by_func (bookmarks->bookmarks_db, |
1911 | midori_bookmarks_remove_item_cb, bookmarks); |
1912 | - katze_array_remove_item (bookmarks->array, item); |
1913 | - g_signal_handlers_unblock_by_func (bookmarks->array, |
1914 | + midori_bookmarks_db_remove_item (bookmarks->bookmarks_db, item); |
1915 | + g_signal_handlers_unblock_by_func (bookmarks->bookmarks_db, |
1916 | midori_bookmarks_remove_item_cb, bookmarks); |
1917 | g_object_unref (item); |
1918 | } |
1919 | @@ -585,9 +587,9 @@ |
1920 | GtkTreeModel* model; |
1921 | |
1922 | model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview)); |
1923 | - if (bookmarks->array) |
1924 | + if (bookmarks->bookmarks_db) |
1925 | { |
1926 | - g_object_unref (bookmarks->array); |
1927 | + g_object_unref (bookmarks->bookmarks_db); |
1928 | gtk_tree_store_clear (GTK_TREE_STORE (model)); |
1929 | } |
1930 | katze_assign (bookmarks->app, app); |
1931 | @@ -595,13 +597,13 @@ |
1932 | return; |
1933 | |
1934 | g_object_ref (app); |
1935 | - bookmarks->array = katze_object_get_object (app, "bookmarks"); |
1936 | + bookmarks->bookmarks_db = katze_object_get_object (app, "bookmarks"); |
1937 | midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model), NULL, 0, NULL); |
1938 | - g_signal_connect_after (bookmarks->array, "add-item", |
1939 | - G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); |
1940 | - g_signal_connect (bookmarks->array, "remove-item", |
1941 | + g_signal_connect_after (bookmarks->bookmarks_db, "add-item", |
1942 | + G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); |
1943 | + g_signal_connect (bookmarks->bookmarks_db, "remove-item", |
1944 | G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks); |
1945 | - g_signal_connect (bookmarks->array, "update", |
1946 | + g_signal_connect (bookmarks->bookmarks_db, "update", |
1947 | G_CALLBACK (midori_bookmarks_update_cb), bookmarks); |
1948 | g_signal_connect_after (model, "row-changed", |
1949 | G_CALLBACK (midori_bookmarks_row_changed_cb), |
1950 | @@ -835,7 +837,7 @@ |
1951 | menu = gtk_menu_new (); |
1952 | if (KATZE_ITEM_IS_FOLDER (item)) |
1953 | { |
1954 | - gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array, |
1955 | + gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1956 | "uri <> ''", NULL, item, FALSE); |
1957 | |
1958 | midori_bookmarks_popup_item (menu, |
1959 | |
1960 | === modified file 'tests/bookmarks.c' |
1961 | --- tests/bookmarks.c 2012-11-25 15:37:41 +0000 |
1962 | +++ tests/bookmarks.c 2013-09-17 21:28:04 +0000 |
1963 | @@ -10,11 +10,11 @@ |
1964 | */ |
1965 | |
1966 | #include "midori.h" |
1967 | -#include "panels/midori-bookmarks.h" |
1968 | +#include "midori-bookmarks-db.h" |
1969 | |
1970 | typedef struct |
1971 | { |
1972 | - KatzeArray* db_bookmarks; |
1973 | + MidoriBookmarksDb* db_bookmarks; |
1974 | KatzeArray* test_bookmarks; |
1975 | } BookmarksFixture; |
1976 | |
1977 | @@ -37,7 +37,7 @@ |
1978 | KatzeArray* folder; |
1979 | gchar *errmsg = NULL; |
1980 | |
1981 | - if (!(fixture->db_bookmarks = midori_bookmarks_new (&errmsg))) |
1982 | + if (!(fixture->db_bookmarks = midori_bookmarks_db_new (&errmsg))) |
1983 | g_error ("Bookmarks couldn't be loaded: %s\n", errmsg); |
1984 | g_assert (errmsg == NULL); |
1985 | g_assert (g_object_get_data (G_OBJECT (fixture->db_bookmarks), "db")); |
1986 | @@ -84,8 +84,8 @@ |
1987 | fixture_teardown (BookmarksFixture* fixture, |
1988 | const TestParameters *params) |
1989 | { |
1990 | - midori_bookmarks_on_quit (fixture->db_bookmarks); |
1991 | - g_object_unref (fixture->db_bookmarks); |
1992 | + midori_bookmarks_db_on_quit (fixture->db_bookmarks); |
1993 | + /* g_object_unref (fixture->db_bookmarks); */ |
1994 | g_object_unref (fixture->test_bookmarks); |
1995 | } |
1996 | |
1997 | @@ -112,7 +112,7 @@ |
1998 | /* NB: assumes "title" is unique in a set */ |
1999 | static void |
2000 | compare_test_and_db (KatzeArray* test_bookmarks, |
2001 | - KatzeArray* db_bookmarks, |
2002 | + MidoriBookmarksDb* db_bookmarks, |
2003 | gboolean verbose) |
2004 | { |
2005 | KatzeArray* db_items; |
2006 | @@ -127,7 +127,7 @@ |
2007 | g_print ("----------\n"); |
2008 | } |
2009 | |
2010 | - db_items = midori_array_query_recursive (db_bookmarks, |
2011 | + db_items = midori_bookmarks_db_query_recursive (db_bookmarks, |
2012 | "*", "title='%q'", katze_item_get_name (test_item), FALSE); |
2013 | |
2014 | /* FIXME g_assert_cmpint (katze_array_get_length (db_items), ==, 1); */ |
2015 | @@ -142,28 +142,33 @@ |
2016 | } |
2017 | |
2018 | static void |
2019 | +print_bookmarks (KatzeArray* test_bookmarks) |
2020 | +{ |
2021 | + KatzeItem* item; |
2022 | + GList* list; |
2023 | + KATZE_ARRAY_FOREACH_ITEM_L (item, test_bookmarks, list) |
2024 | + { |
2025 | + print_bookmark (item); |
2026 | + g_print ("----------\n"); |
2027 | + |
2028 | + if (KATZE_ITEM_IS_FOLDER(item)) |
2029 | + print_bookmarks (KATZE_ARRAY (item)); |
2030 | + } |
2031 | + g_list_free (list); |
2032 | +} |
2033 | + |
2034 | +static void |
2035 | insert_bookmarks (KatzeArray* test_bookmarks, |
2036 | - KatzeArray* db_bookmarks, |
2037 | + MidoriBookmarksDb* db_bookmarks, |
2038 | gboolean verbose) |
2039 | { |
2040 | - KatzeItem* item; |
2041 | - GList* list; |
2042 | - sqlite3 *db = g_object_get_data (G_OBJECT (db_bookmarks), "db"); |
2043 | |
2044 | - KATZE_ARRAY_FOREACH_ITEM_L (item, test_bookmarks, list) |
2045 | + if (verbose) |
2046 | { |
2047 | - if (verbose) |
2048 | - { |
2049 | - print_bookmark (item); |
2050 | - g_print ("----------\n"); |
2051 | - } |
2052 | - |
2053 | - midori_bookmarks_insert_item_db (db, item, 0); |
2054 | - |
2055 | - if (KATZE_ITEM_IS_FOLDER(item)) |
2056 | - insert_bookmarks (KATZE_ARRAY (item), db_bookmarks, verbose); |
2057 | + print_bookmarks (test_bookmarks); |
2058 | } |
2059 | - g_list_free (list); |
2060 | + |
2061 | + midori_bookmarks_db_import_array (db_bookmarks, test_bookmarks, 0); |
2062 | } |
2063 | |
2064 | static void |