Merge lp:~aauzi/midori/fix-1179200-5 into lp:midori
- fix-1179200-5
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Cris Dywan | Approve | ||
Cody Garver (community) | Needs Fixing | ||
Review via email:
|
Commit message
Introduces KatzeArray:
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)
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
Cody Garver (codygarver) wrote : | # |
There are also merge artifacts in the diff like line 137
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
982c80311320c1b (alexander-wilms) wrote : | # |
I tried to resolve the conflict: lp:~alexander-wilms/midori/fix-1179200-5-without-conflicts
- 6325. By André Auzi
-
fix indentation errors
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
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?
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
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.
- 6326. By André Auzi
-
make KatzeArray struct content private
- 6327. By André Auzi
-
merge lp:midori to fix conficts
![](/+icing/build/overlay/assets/skins/sam/images/close.gif)
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
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 19:35:27 +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 19:35:27 +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 19:35:27 +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 19:35:27 +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 19:35:27 +0000 |
304 | @@ -25,14 +25,324 @@ |
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 | +}; |
331 | + |
332 | +struct _MidoriBookmarksDbClass |
333 | +{ |
334 | + KatzeArrayClass parent_class; |
335 | + |
336 | + /* Signals */ |
337 | + void |
338 | + (*update_item) (MidoriBookmarksDb* bookmarks, |
339 | + gpointer item); |
340 | +}; |
341 | + |
342 | +G_DEFINE_TYPE (MidoriBookmarksDb, midori_bookmarks_db, KATZE_TYPE_ARRAY); |
343 | + |
344 | +enum { |
345 | + UPDATE_ITEM, |
346 | + |
347 | + LAST_SIGNAL |
348 | +}; |
349 | + |
350 | +static guint signals[LAST_SIGNAL]; |
351 | + |
352 | +static void |
353 | +_midori_bookmarks_db_add_item (KatzeArray* array, |
354 | + gpointer item); |
355 | + |
356 | +static void |
357 | +_midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, |
358 | + gpointer item); |
359 | + |
360 | +static void |
361 | +_midori_bookmarks_db_remove_item (KatzeArray* array, |
362 | + gpointer item); |
363 | + |
364 | +static void |
365 | +_midori_bookmarks_db_move_item (KatzeArray* array, |
366 | + gpointer item, |
367 | + gint position); |
368 | + |
369 | +static void |
370 | +_midori_bookmarks_db_clear (KatzeArray* array); |
371 | + |
372 | +static void |
373 | +midori_bookmarks_db_finalize (GObject* object); |
374 | + |
375 | +static gint64 |
376 | +midori_bookmarks_db_insert_item_db (sqlite3* db, |
377 | + KatzeItem* item, |
378 | + gint64 parentid); |
379 | + |
380 | +static gboolean |
381 | +midori_bookmarks_db_update_item_db (sqlite3* db, |
382 | + KatzeItem* item); |
383 | + |
384 | +static gboolean |
385 | +midori_bookmarks_db_remove_item_db (sqlite3* db, |
386 | + KatzeItem* item); |
387 | + |
388 | +static void |
389 | +midori_bookmarks_db_class_init (MidoriBookmarksDbClass* class) |
390 | +{ |
391 | + GObjectClass* gobject_class; |
392 | + KatzeArrayClass* katze_array_class; |
393 | + |
394 | + gobject_class = G_OBJECT_CLASS (class); |
395 | + gobject_class->finalize = midori_bookmarks_db_finalize; |
396 | + |
397 | + signals[UPDATE_ITEM] = g_signal_new ( |
398 | + "update-item", |
399 | + G_TYPE_FROM_CLASS (class), |
400 | + (GSignalFlags)(G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION), |
401 | + G_STRUCT_OFFSET (MidoriBookmarksDbClass, update_item), |
402 | + 0, |
403 | + NULL, |
404 | + g_cclosure_marshal_VOID__POINTER, |
405 | + G_TYPE_NONE, 1, |
406 | + G_TYPE_POINTER); |
407 | + |
408 | + katze_array_class = KATZE_ARRAY_CLASS (class); |
409 | + |
410 | + katze_array_class->add_item = _midori_bookmarks_db_add_item; |
411 | + katze_array_class->remove_item = _midori_bookmarks_db_remove_item; |
412 | + katze_array_class->move_item = _midori_bookmarks_db_move_item; |
413 | + katze_array_class->clear = _midori_bookmarks_db_clear; |
414 | + |
415 | + class->update_item = _midori_bookmarks_db_update_item; |
416 | +} |
417 | + |
418 | +static void |
419 | +midori_bookmarks_db_init (MidoriBookmarksDb* bookmarks) |
420 | +{ |
421 | + bookmarks->db = NULL; |
422 | + |
423 | + katze_item_set_meta_integer (KATZE_ITEM (bookmarks), "id", 0); |
424 | + katze_item_set_name (KATZE_ITEM (bookmarks), _("Bookmarks")); |
425 | + /* g_object_ref (bookmarks); */ |
426 | +} |
427 | + |
428 | +static void |
429 | +midori_bookmarks_db_finalize (GObject* object) |
430 | +{ |
431 | + MidoriBookmarksDb* bookmarks = MIDORI_BOOKMARKS_DB (object); |
432 | + |
433 | + if (bookmarks->db) |
434 | + { |
435 | + sqlite3_close (bookmarks->db); |
436 | + } |
437 | + |
438 | + G_OBJECT_CLASS (midori_bookmarks_db_parent_class)->finalize (object); |
439 | +} |
440 | + |
441 | +/** |
442 | + * midori_bookmarks_db_get_item_parent: |
443 | + * @bookmarks: the main bookmarks array |
444 | + * @item: a #KatzeItem |
445 | + * |
446 | + * Internal function that find the parent of the @item thanks to its %parentid |
447 | + **/ |
448 | +static KatzeArray* |
449 | +midori_bookmarks_db_get_item_parent (MidoriBookmarksDb* bookmarks, |
450 | + gpointer item) |
451 | +{ |
452 | + KatzeArray* parent; |
453 | + gint64 parentid; |
454 | + |
455 | + parentid = katze_item_get_meta_integer (KATZE_ITEM (item), "parentid"); |
456 | + |
457 | + if (parentid == 0) |
458 | + { |
459 | + parent = KATZE_ARRAY (bookmarks); |
460 | + } |
461 | + else |
462 | + { |
463 | + parent = NULL; |
464 | + } |
465 | + |
466 | + return parent; |
467 | +} |
468 | + |
469 | +/** |
470 | + * _midori_bookmarks_db_add_item: |
471 | + * @array: the main bookmarks array |
472 | + * @item: a #KatzeItem |
473 | + * |
474 | + * Internal function that overloads the #KatzeArray %katze_array_add_item(). |
475 | + * It relays the add item to the appropriate #KatzeArray. |
476 | + **/ |
477 | +static void |
478 | +_midori_bookmarks_db_add_item (KatzeArray* array, |
479 | + gpointer item) |
480 | +{ |
481 | + MidoriBookmarksDb *bookmarks; |
482 | + KatzeArray* parent; |
483 | + KatzeArray* db_parent; |
484 | + |
485 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
486 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
487 | + |
488 | + bookmarks = MIDORI_BOOKMARKS_DB (array); |
489 | + |
490 | + parent = katze_item_get_parent (KATZE_ITEM (item)); |
491 | + |
492 | + db_parent = midori_bookmarks_db_get_item_parent (bookmarks, item); |
493 | + |
494 | + g_return_if_fail (db_parent); |
495 | + |
496 | + if (parent == db_parent) |
497 | + { |
498 | + if (IS_MIDORI_BOOKMARKS_DB (parent)) |
499 | + KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->update (parent); |
500 | + else |
501 | + katze_array_update (parent); |
502 | + return; |
503 | + } |
504 | + |
505 | + if (IS_MIDORI_BOOKMARKS_DB (parent)) |
506 | + KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->add_item (parent, item); |
507 | + else |
508 | + katze_array_add_item (parent, item); |
509 | +} |
510 | + |
511 | +/** |
512 | + * _midori_bookmarks_db_update_item: |
513 | + * @array: the main bookmarks array |
514 | + * @item: a #KatzeItem |
515 | + * |
516 | + * Internal function that implements the %midori_bookmarks_db_update_item() post-processing. |
517 | + * It relays an update to the appropriate #KatzeArray. |
518 | + **/ |
519 | +static void |
520 | +_midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, |
521 | + gpointer item) |
522 | +{ |
523 | + KatzeArray* parent; |
524 | + |
525 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
526 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
527 | + |
528 | + parent = katze_item_get_parent (KATZE_ITEM (item)); |
529 | + |
530 | + g_return_if_fail (parent); |
531 | + |
532 | + katze_array_update (parent); |
533 | +} |
534 | + |
535 | +/** |
536 | + * _midori_bookmarks_db_remove_item: |
537 | + * @array: the main bookmarks array |
538 | + * @item: a #KatzeItem |
539 | + * |
540 | + * Internal function that overloads the #KatzeArray %katze_array_remove_item(). |
541 | + * It relays the remove item to the appropriate #KatzeArray. |
542 | + **/ |
543 | +static void |
544 | +_midori_bookmarks_db_remove_item (KatzeArray* array, |
545 | + gpointer item) |
546 | +{ |
547 | + KatzeArray* parent; |
548 | + |
549 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
550 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
551 | + |
552 | + parent = katze_item_get_parent (KATZE_ITEM (item)); |
553 | + |
554 | + g_return_if_fail (parent); |
555 | + |
556 | + if (IS_MIDORI_BOOKMARKS_DB (parent)) |
557 | + KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->remove_item (parent, item); |
558 | + else |
559 | + katze_array_remove_item (parent, item); |
560 | +} |
561 | + |
562 | +/** |
563 | + * _midori_bookmarks_db_move_item: |
564 | + * @array: the main bookmarks array |
565 | + * @item: a #KatzeItem |
566 | + * @position: the new @item position |
567 | + * |
568 | + * Internal function that overloads the #KatzeArray %katze_array_move_item(). |
569 | + * It relays the move @item to the appropriate #KatzeArray. |
570 | + **/ |
571 | +static void |
572 | +_midori_bookmarks_db_move_item (KatzeArray* array, |
573 | + gpointer item, |
574 | + gint position) |
575 | +{ |
576 | + MidoriBookmarksDb *bookmarks; |
577 | + KatzeArray* parent; |
578 | + |
579 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
580 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
581 | + |
582 | + parent = katze_item_get_parent (KATZE_ITEM (item)); |
583 | + |
584 | + g_return_if_fail (parent); |
585 | + |
586 | + KATZE_ARRAY_CLASS (midori_bookmarks_db_parent_class)->move_item (parent, item, position); |
587 | +} |
588 | + |
589 | +/** |
590 | + * _midori_bookmarks_db_clear: |
591 | + * @array: the main bookmarks array |
592 | + * |
593 | + * Internal function that overloads the #KatzeArray %katze_array_clear(). |
594 | + * It deletes the whole bookmarks data. |
595 | + **/ |
596 | +static void |
597 | +_midori_bookmarks_db_clear (KatzeArray* array) |
598 | +{ |
599 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
600 | + |
601 | + g_critical ("_midori_bookmarks_db_clear: not implemented\n"); |
602 | +} |
603 | + |
604 | +/** |
605 | + * midori_bookmarks_db_signal_update_item: |
606 | + * @array: a #KatzeArray |
607 | + * @item: an item |
608 | + * |
609 | + * Notify an update of the item of the array. |
610 | + * |
611 | + **/ |
612 | +static void |
613 | +midori_bookmarks_db_signal_update_item (MidoriBookmarksDb* array, |
614 | + gpointer item) |
615 | +{ |
616 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (array)); |
617 | + |
618 | + g_signal_emit (array, signals[UPDATE_ITEM], 0, item); |
619 | +} |
620 | + |
621 | +/** |
622 | + * midori_bookmarks_db_insert_item_db: |
623 | + * @db: the #sqlite3 |
624 | + * @item: #KatzeItem the item to insert |
625 | + * |
626 | + * Internal function that does the actual SQL INSERT of the @item in @db. |
627 | + * |
628 | + * Since: 0.5.2 |
629 | + **/ |
630 | +static gint64 |
631 | +midori_bookmarks_db_insert_item_db (sqlite3* db, |
632 | + KatzeItem* item, |
633 | + gint64 parentid) |
634 | { |
635 | gchar* sqlcmd; |
636 | char* errmsg = NULL; |
637 | @@ -70,15 +380,15 @@ |
638 | new_parentid = g_strdup_printf ("NULL"); |
639 | |
640 | sqlcmd = sqlite3_mprintf ( |
641 | - "INSERT INTO bookmarks (id, parentid, title, uri, desc, toolbar, app) " |
642 | - "VALUES (%q, %q, '%q', '%q', '%q', %d, %d)", |
643 | - id, |
644 | - new_parentid, |
645 | - katze_item_get_name (item), |
646 | - katze_str_non_null (uri), |
647 | - katze_str_non_null (desc), |
648 | - katze_item_get_meta_boolean (item, "toolbar"), |
649 | - katze_item_get_meta_boolean (item, "app")); |
650 | + "INSERT INTO bookmarks (id, parentid, title, uri, desc, toolbar, app) " |
651 | + "VALUES (%q, %q, '%q', '%q', '%q', %d, %d)", |
652 | + id, |
653 | + new_parentid, |
654 | + katze_item_get_name (item), |
655 | + katze_str_non_null (uri), |
656 | + katze_str_non_null (desc), |
657 | + katze_item_get_meta_boolean (item, "toolbar"), |
658 | + katze_item_get_meta_boolean (item, "app")); |
659 | |
660 | if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) == SQLITE_OK) |
661 | { |
662 | @@ -89,7 +399,7 @@ |
663 | |
664 | sqlite3_free (sqlcmd); |
665 | sqlcmd = sqlite3_mprintf ( |
666 | - "SELECT seq FROM sqlite_sequence WHERE name = 'bookmarks'"); |
667 | + "SELECT seq FROM sqlite_sequence WHERE name = 'bookmarks'"); |
668 | |
669 | seq_array = katze_array_from_sqlite (db, sqlcmd); |
670 | if (katze_array_get_nth_item (seq_array, 0)) |
671 | @@ -115,8 +425,17 @@ |
672 | return seq; |
673 | } |
674 | |
675 | -gboolean |
676 | -midori_bookmarks_update_item_db (sqlite3* db, |
677 | +/** |
678 | + * midori_bookmarks_db_update_item_db: |
679 | + * @db: the #sqlite3 |
680 | + * @item: #KatzeItem the item to update |
681 | + * |
682 | + * Internal function that does the actual SQL UPDATE of the @item in @db. |
683 | + * |
684 | + * Since: 0.5.2 |
685 | + **/ |
686 | +static gboolean |
687 | +midori_bookmarks_db_update_item_db (sqlite3* db, |
688 | KatzeItem* item) |
689 | { |
690 | gchar* sqlcmd; |
691 | @@ -126,7 +445,7 @@ |
692 | gchar* id; |
693 | |
694 | id = g_strdup_printf ("%" G_GINT64_FORMAT, |
695 | - katze_item_get_meta_integer (item, "id")); |
696 | + katze_item_get_meta_integer (item, "id")); |
697 | |
698 | if (katze_item_get_meta_integer (item, "parentid") > 0) |
699 | parentid = g_strdup_printf ("%" G_GINT64_FORMAT, |
700 | @@ -135,16 +454,16 @@ |
701 | parentid = g_strdup_printf ("NULL"); |
702 | |
703 | sqlcmd = sqlite3_mprintf ( |
704 | - "UPDATE bookmarks SET " |
705 | - "parentid=%q, title='%q', uri='%q', desc='%q', toolbar=%d, app=%d " |
706 | - "WHERE id = %q ;", |
707 | - parentid, |
708 | - katze_item_get_name (item), |
709 | - katze_str_non_null (katze_item_get_uri (item)), |
710 | - katze_str_non_null (katze_item_get_meta_string (item, "desc")), |
711 | - katze_item_get_meta_boolean (item, "toolbar"), |
712 | - katze_item_get_meta_boolean (item, "app"), |
713 | - id); |
714 | + "UPDATE bookmarks SET " |
715 | + "parentid=%q, title='%q', uri='%q', desc='%q', toolbar=%d, app=%d " |
716 | + "WHERE id = %q ;", |
717 | + parentid, |
718 | + katze_item_get_name (item), |
719 | + katze_str_non_null (katze_item_get_uri (item)), |
720 | + katze_str_non_null (katze_item_get_meta_string (item, "desc")), |
721 | + katze_item_get_meta_boolean (item, "toolbar"), |
722 | + katze_item_get_meta_boolean (item, "app"), |
723 | + id); |
724 | |
725 | updated = TRUE; |
726 | if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK) |
727 | @@ -162,68 +481,104 @@ |
728 | } |
729 | |
730 | /** |
731 | + * midori_bookmarks_db_remove_item_db: |
732 | + * @db: the #sqlite3 |
733 | + * @item: #KatzeItem the item to delete |
734 | + * |
735 | + * Internal function that does the actual SQL DELETE of the @item in @db. |
736 | + * |
737 | + * Since: 0.5.2 |
738 | + **/ |
739 | +static gboolean |
740 | +midori_bookmarks_db_remove_item_db (sqlite3* db, |
741 | + KatzeItem* item) |
742 | +{ |
743 | + char* errmsg = NULL; |
744 | + gchar* sqlcmd; |
745 | + gboolean removed = TRUE; |
746 | + gchar* id; |
747 | + |
748 | + id = g_strdup_printf ("%" G_GINT64_FORMAT, |
749 | + katze_item_get_meta_integer (item, "id")); |
750 | + |
751 | + sqlcmd = sqlite3_mprintf ("DELETE FROM bookmarks WHERE id = %q", id); |
752 | + |
753 | + if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK) |
754 | + { |
755 | + g_printerr (_("Failed to remove bookmark item: %s\n"), errmsg); |
756 | + sqlite3_free (errmsg); |
757 | + removed = FALSE; |
758 | + } |
759 | + |
760 | + sqlite3_free (sqlcmd); |
761 | + g_free (id); |
762 | + return removed; |
763 | +} |
764 | + |
765 | +/** |
766 | + * midori_bookmarks_db_add_item: |
767 | + * @bookmarks: the main bookmark array |
768 | + * @item: #KatzeItem the item to update |
769 | + * |
770 | + * Adds the @item in the bookmark data base. |
771 | + * |
772 | + * Since: 0.5.2 |
773 | + **/ |
774 | +void |
775 | +midori_bookmarks_db_add_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) |
776 | +{ |
777 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
778 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
779 | + g_return_if_fail (NULL == katze_item_get_meta_string (item, "id")); |
780 | + |
781 | + midori_bookmarks_db_insert_item_db (bookmarks->db, item, |
782 | + katze_item_get_meta_integer (item, "parentid")); |
783 | + |
784 | + katze_array_add_item (KATZE_ARRAY (bookmarks), item); |
785 | +} |
786 | + |
787 | +/** |
788 | * midori_bookmarks_db_update_item: |
789 | * @bookmarks: the main bookmark array |
790 | * @item: #KatzeItem the item to update |
791 | * |
792 | * Updates the @item in the bookmark data base. |
793 | * |
794 | - * Since: 0.5.5 |
795 | - **/ |
796 | -void |
797 | -midori_array_update_item (KatzeArray* bookmarks, |
798 | - KatzeItem* item) |
799 | -{ |
800 | - g_return_if_fail (KATZE_IS_ARRAY (bookmarks)); |
801 | - g_return_if_fail (KATZE_IS_ITEM (item)); |
802 | - g_return_if_fail (katze_item_get_meta_string (item, "id")); |
803 | - g_return_if_fail (0 != katze_item_get_meta_integer (item, "id")); |
804 | - |
805 | - sqlite3* db = g_object_get_data (G_OBJECT (bookmarks), "db"); |
806 | - |
807 | - g_return_if_fail (db); |
808 | - |
809 | - midori_bookmarks_update_item_db (db, item); |
810 | -} |
811 | - |
812 | -void |
813 | -midori_bookmarks_dbtracer (void* dummy, |
814 | - const char* query) |
815 | -{ |
816 | - g_printerr ("%s\n", query); |
817 | -} |
818 | - |
819 | -static void |
820 | -midori_bookmarks_add_item_cb (KatzeArray* array, |
821 | - KatzeItem* item, |
822 | - sqlite3* db) |
823 | -{ |
824 | - midori_bookmarks_insert_item_db (db, item, |
825 | - katze_item_get_meta_integer (item, "parentid")); |
826 | -} |
827 | - |
828 | -static void |
829 | -midori_bookmarks_remove_item_cb (KatzeArray* array, |
830 | - KatzeItem* item, |
831 | - sqlite3* db) |
832 | -{ |
833 | - gchar* sqlcmd; |
834 | - char* errmsg = NULL; |
835 | - gchar* id; |
836 | - |
837 | - id = g_strdup_printf ("%" G_GINT64_FORMAT, |
838 | - katze_item_get_meta_integer (item, "id")); |
839 | - |
840 | - sqlcmd = sqlite3_mprintf ("DELETE FROM bookmarks WHERE id = %q", id); |
841 | - |
842 | - if (sqlite3_exec (db, sqlcmd, NULL, NULL, &errmsg) != SQLITE_OK) |
843 | - { |
844 | - g_printerr (_("Failed to remove bookmark item: %s\n"), errmsg); |
845 | - sqlite3_free (errmsg); |
846 | - } |
847 | - |
848 | - sqlite3_free (sqlcmd); |
849 | - g_free (id); |
850 | + * Since: 0.5.2 |
851 | + **/ |
852 | +void |
853 | +midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) |
854 | +{ |
855 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
856 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
857 | + g_return_if_fail (katze_item_get_meta_string (item, "id")); |
858 | + g_return_if_fail (0 != katze_item_get_meta_integer (item, "id")); |
859 | + |
860 | + midori_bookmarks_db_update_item_db (bookmarks->db, item); |
861 | + |
862 | + midori_bookmarks_db_signal_update_item (bookmarks, item); |
863 | +} |
864 | + |
865 | +/** |
866 | + * midori_bookmarks_db_remove_item: |
867 | + * @bookmarks: the main bookmark array |
868 | + * @item: #KatzeItem the item to remove |
869 | + * |
870 | + * Removes the @item from the bookmark data base. |
871 | + * |
872 | + * Since: 0.5.2 |
873 | + **/ |
874 | +void |
875 | +midori_bookmarks_db_remove_item (MidoriBookmarksDb* bookmarks, KatzeItem* item) |
876 | +{ |
877 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
878 | + g_return_if_fail (KATZE_IS_ITEM (item)); |
879 | + g_return_if_fail (katze_item_get_meta_string (item, "id")); |
880 | + g_return_if_fail (0 != katze_item_get_meta_integer (item, "id")); |
881 | + |
882 | + midori_bookmarks_db_remove_item_db (bookmarks->db, item); |
883 | + |
884 | + katze_array_remove_item (KATZE_ARRAY (bookmarks), item); |
885 | } |
886 | |
887 | #define _APPEND_TO_SQL_ERRORMSG(custom_errmsg) \ |
888 | @@ -237,8 +592,8 @@ |
889 | g_string_append (errmsg_str, custom_errmsg); \ |
890 | } while (0) |
891 | |
892 | -gboolean |
893 | -midori_bookmarks_import_from_old_db (sqlite3* db, |
894 | +static gboolean |
895 | +midori_bookmarks_db_import_from_old_db (sqlite3* db, |
896 | const gchar* oldfile, |
897 | gchar** errmsg) |
898 | { |
899 | @@ -293,8 +648,24 @@ |
900 | } |
901 | #undef _APPEND_TO_SQL_ERRORMSG |
902 | |
903 | -KatzeArray* |
904 | -midori_bookmarks_new (char** errmsg) |
905 | +static void |
906 | +midori_bookmarks_db_dbtracer (void* dummy, |
907 | + const char* query) |
908 | +{ |
909 | + g_printerr ("%s\n", query); |
910 | +} |
911 | + |
912 | +/** |
913 | + * midori_bookmarks_db_new: |
914 | + * |
915 | + * Initializes the bookmark data base. |
916 | + * |
917 | + * Returns: the main bookmarks array |
918 | + * |
919 | + * Since: 0.5.2 |
920 | + **/ |
921 | +MidoriBookmarksDb* |
922 | +midori_bookmarks_db_new (char** errmsg) |
923 | { |
924 | sqlite3* db; |
925 | gchar* oldfile; |
926 | @@ -304,6 +675,7 @@ |
927 | gchar* sql_errmsg = NULL; |
928 | gchar* import_errmsg = NULL; |
929 | KatzeArray* array; |
930 | + MidoriBookmarksDb* bookmarks; |
931 | |
932 | g_return_val_if_fail (errmsg != NULL, NULL); |
933 | |
934 | @@ -321,7 +693,7 @@ |
935 | } |
936 | |
937 | if (midori_debug ("bookmarks")) |
938 | - sqlite3_trace (db, midori_bookmarks_dbtracer, NULL); |
939 | + sqlite3_trace (db, midori_bookmarks_db_dbtracer, NULL); |
940 | |
941 | create_stmt = /* Table structure */ |
942 | "CREATE TABLE IF NOT EXISTS bookmarks " |
943 | @@ -442,7 +814,7 @@ |
944 | |
945 | if (oldfile_exists) |
946 | /* import from old db */ |
947 | - if (!midori_bookmarks_import_from_old_db (db, oldfile, &import_errmsg)) |
948 | + if (!midori_bookmarks_db_import_from_old_db (db, oldfile, &import_errmsg)) |
949 | { |
950 | *errmsg = g_strdup_printf (_("Couldn't import from old database: %s\n"), |
951 | import_errmsg ? import_errmsg : "(err = NULL)"); |
952 | @@ -452,13 +824,11 @@ |
953 | init_success: |
954 | g_free (newfile); |
955 | g_free (oldfile); |
956 | - array = katze_array_new (KATZE_TYPE_ARRAY); |
957 | - g_signal_connect (array, "add-item", |
958 | - G_CALLBACK (midori_bookmarks_add_item_cb), db); |
959 | - g_signal_connect (array, "remove-item", |
960 | - G_CALLBACK (midori_bookmarks_remove_item_cb), db); |
961 | - g_object_set_data (G_OBJECT (array), "db", db); |
962 | - return array; |
963 | + bookmarks = MIDORI_BOOKMARKS_DB (g_object_new (TYPE_MIDORI_BOOKMARKS_DB, NULL)); |
964 | + bookmarks->db = db; |
965 | + |
966 | + g_object_set_data (G_OBJECT (bookmarks), "db", db); |
967 | + return bookmarks; |
968 | |
969 | init_failed: |
970 | g_free (newfile); |
971 | @@ -470,40 +840,140 @@ |
972 | return NULL; |
973 | } |
974 | |
975 | +/** |
976 | + * midori_bookmarks_db_on_quit: |
977 | + * @bookmarks: the main bookmark array |
978 | + * |
979 | + * Delete the main bookmark array. |
980 | + * |
981 | + * Since: 0.5.2 |
982 | + **/ |
983 | void |
984 | -midori_bookmarks_on_quit (KatzeArray* array) |
985 | +midori_bookmarks_db_on_quit (MidoriBookmarksDb* bookmarks) |
986 | { |
987 | - g_return_if_fail (KATZE_IS_ARRAY (array)); |
988 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
989 | |
990 | - sqlite3* db = g_object_get_data (G_OBJECT (array), "db"); |
991 | - g_return_if_fail (db != NULL); |
992 | - sqlite3_close (db); |
993 | + g_object_unref (bookmarks); |
994 | } |
995 | |
996 | +/** |
997 | + * midori_bookmarks_db_import_array: |
998 | + * @array: the main bookmark array |
999 | + * @array: #KatzeArray containing the items to import |
1000 | + * @parentid: the id of folder |
1001 | + * |
1002 | + * Imports the items of @array as childs of the folder |
1003 | + * identfied by @parentid. |
1004 | + * |
1005 | + * Since: 0.5.2 |
1006 | + **/ |
1007 | void |
1008 | -midori_bookmarks_import_array (KatzeArray* bookmarks, |
1009 | +midori_bookmarks_db_import_array (MidoriBookmarksDb* bookmarks, |
1010 | KatzeArray* array, |
1011 | gint64 parentid) |
1012 | { |
1013 | GList* list; |
1014 | KatzeItem* item; |
1015 | |
1016 | - if (!bookmarks) |
1017 | - return; |
1018 | + g_return_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks)); |
1019 | + g_return_if_fail (KATZE_IS_ARRAY (array)); |
1020 | |
1021 | KATZE_ARRAY_FOREACH_ITEM_L (item, array, list) |
1022 | { |
1023 | katze_item_set_meta_integer (item, "parentid", parentid); |
1024 | - katze_array_add_item (bookmarks, item); |
1025 | + midori_bookmarks_db_add_item (bookmarks, item); |
1026 | if (KATZE_IS_ARRAY (item)) |
1027 | - midori_bookmarks_import_array (bookmarks, KATZE_ARRAY (item), |
1028 | - katze_item_get_meta_integer(item, "id")); |
1029 | + midori_bookmarks_db_import_array (bookmarks, KATZE_ARRAY (item), |
1030 | + katze_item_get_meta_integer(item, "id")); |
1031 | } |
1032 | g_list_free (list); |
1033 | } |
1034 | |
1035 | /** |
1036 | - * midori_array_query_recursive: |
1037 | + * midori_bookmarks_db_array_from_statement: |
1038 | + * @stmt: the sqlite returned statement |
1039 | + * @bookmarks: the database controller |
1040 | + * |
1041 | + * Internal function that populate a #KatzeArray by processing the @stmt |
1042 | + * rows identifying: |
1043 | + * a- if the item is already in memory |
1044 | + * in this case the item data is updated with retreived database content |
1045 | + * and the already existing item is populated in the returned #KatzeArray |
1046 | + * b- if the data is a folder |
1047 | + * a new #KatzeArray item is populated in the returned #KatzeArray and |
1048 | + * memorized for future use. |
1049 | + * c- if the data is a bookmark |
1050 | + * a new #KatzeItem item is populated in the returned #KatzeArray and |
1051 | + * memorized for furure use. |
1052 | + * |
1053 | + * Return value: the populated #KatzeArray |
1054 | + **/ |
1055 | +static KatzeArray* |
1056 | +midori_bookmarks_db_array_from_statement (sqlite3_stmt* stmt, |
1057 | + MidoriBookmarksDb* bookmarks) |
1058 | +{ |
1059 | + KatzeArray *array; |
1060 | + gint result; |
1061 | + gint cols; |
1062 | + |
1063 | + array = katze_array_new (KATZE_TYPE_ITEM); |
1064 | + cols = sqlite3_column_count (stmt); |
1065 | + |
1066 | + while ((result = sqlite3_step (stmt)) == SQLITE_ROW) |
1067 | + { |
1068 | + gint i; |
1069 | + KatzeItem* item; |
1070 | + KatzeItem* found; |
1071 | + |
1072 | + item = katze_item_new (); |
1073 | + for (i = 0; i < cols; i++) |
1074 | + katze_item_set_value_from_column (stmt, i, item); |
1075 | + |
1076 | + if (KATZE_ITEM_IS_FOLDER (item)) |
1077 | + { |
1078 | + g_object_unref (item); |
1079 | + |
1080 | + item = KATZE_ITEM (katze_array_new (KATZE_TYPE_ITEM)); |
1081 | + |
1082 | + for (i = 0; i < cols; i++) |
1083 | + katze_item_set_value_from_column (stmt, i, item); |
1084 | + } |
1085 | + |
1086 | + katze_array_add_item (array, item); |
1087 | + } |
1088 | + |
1089 | + sqlite3_clear_bindings (stmt); |
1090 | + sqlite3_reset (stmt); |
1091 | + return array; |
1092 | +} |
1093 | + |
1094 | +/** |
1095 | + * midori_bookmarks_db_array_from_sqlite: |
1096 | + * @array: the main bookmark array |
1097 | + * @sqlcmd: the sqlcmd to execute |
1098 | + * |
1099 | + * Internal function that process the requested @sqlcmd. |
1100 | + * |
1101 | + * Return value: a #KatzeArray on success, %NULL otherwise |
1102 | + **/ |
1103 | +static KatzeArray* |
1104 | +midori_bookmarks_db_array_from_sqlite (MidoriBookmarksDb* bookmarks, |
1105 | + const gchar* sqlcmd) |
1106 | +{ |
1107 | + sqlite3_stmt* stmt; |
1108 | + gint result; |
1109 | + |
1110 | + g_return_val_if_fail (bookmarks->db != NULL, NULL); |
1111 | + |
1112 | + result = sqlite3_prepare_v2 (bookmarks->db, sqlcmd, -1, &stmt, NULL); |
1113 | + if (result != SQLITE_OK) |
1114 | + return NULL; |
1115 | + |
1116 | + return midori_bookmarks_db_array_from_statement (stmt, bookmarks); |
1117 | +} |
1118 | + |
1119 | +/** |
1120 | + * midori_bookmarks_db_query_recursive: |
1121 | * @array: the main bookmark array |
1122 | * @fields: comma separated list of fields |
1123 | * @condition: condition, like "folder = '%q'" |
1124 | @@ -514,38 +984,35 @@ |
1125 | * |
1126 | * Return value: a #KatzeArray on success, %NULL otherwise |
1127 | * |
1128 | - * Since: 0.4.4 |
1129 | + * Since: 0.5.2 |
1130 | **/ |
1131 | KatzeArray* |
1132 | -midori_array_query_recursive (KatzeArray* bookmarks, |
1133 | - const gchar* fields, |
1134 | - const gchar* condition, |
1135 | - const gchar* value, |
1136 | - gboolean recursive) |
1137 | +midori_bookmarks_db_query_recursive (MidoriBookmarksDb* bookmarks, |
1138 | + const gchar* fields, |
1139 | + const gchar* condition, |
1140 | + const gchar* value, |
1141 | + gboolean recursive) |
1142 | { |
1143 | - sqlite3* db; |
1144 | gchar* sqlcmd; |
1145 | char* sqlcmd_value; |
1146 | KatzeArray* array; |
1147 | KatzeItem* item; |
1148 | GList* list; |
1149 | |
1150 | - g_return_val_if_fail (KATZE_IS_ARRAY (bookmarks), NULL); |
1151 | + g_return_val_if_fail (IS_MIDORI_BOOKMARKS_DB (bookmarks), NULL); |
1152 | g_return_val_if_fail (fields, NULL); |
1153 | g_return_val_if_fail (condition, NULL); |
1154 | - db = g_object_get_data (G_OBJECT (bookmarks), "db"); |
1155 | - g_return_val_if_fail (db != NULL, NULL); |
1156 | |
1157 | sqlcmd = g_strdup_printf ("SELECT %s FROM bookmarks WHERE %s " |
1158 | "ORDER BY (uri='') ASC, title DESC", fields, condition); |
1159 | if (strstr (condition, "%q")) |
1160 | { |
1161 | sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : ""); |
1162 | - array = katze_array_from_sqlite (db, sqlcmd_value); |
1163 | + array = midori_bookmarks_db_array_from_sqlite (bookmarks, sqlcmd_value); |
1164 | sqlite3_free (sqlcmd_value); |
1165 | } |
1166 | else |
1167 | - array = katze_array_from_sqlite (db, sqlcmd); |
1168 | + array = midori_bookmarks_db_array_from_sqlite (bookmarks, sqlcmd); |
1169 | g_free (sqlcmd); |
1170 | |
1171 | if (!recursive) |
1172 | @@ -556,9 +1023,9 @@ |
1173 | if (KATZE_ITEM_IS_FOLDER (item)) |
1174 | { |
1175 | gchar* parentid = g_strdup_printf ("%" G_GINT64_FORMAT, |
1176 | - katze_item_get_meta_integer (item, "id")); |
1177 | - KatzeArray* subarray = midori_array_query_recursive (bookmarks, |
1178 | - fields, "parentid=%q", parentid, TRUE); |
1179 | + katze_item_get_meta_integer (item, "id")); |
1180 | + KatzeArray* subarray = midori_bookmarks_db_query_recursive (bookmarks, |
1181 | + fields, "parentid=%q", parentid, TRUE); |
1182 | KatzeItem* subitem; |
1183 | GList* sublist; |
1184 | |
1185 | @@ -576,21 +1043,21 @@ |
1186 | } |
1187 | |
1188 | static gint64 |
1189 | -count_from_sqlite (sqlite3* db, |
1190 | - const gchar* sqlcmd) |
1191 | +midori_bookmarks_db_count_from_sqlite (sqlite3* db, |
1192 | + const gchar* sqlcmd) |
1193 | { |
1194 | gint64 count = -1; |
1195 | sqlite3_stmt* stmt; |
1196 | gint result; |
1197 | - |
1198 | + |
1199 | result = sqlite3_prepare_v2 (db, sqlcmd, -1, &stmt, NULL); |
1200 | if (result != SQLITE_OK) |
1201 | return -1; |
1202 | |
1203 | g_assert (sqlite3_column_count (stmt) == 1); |
1204 | - |
1205 | + |
1206 | if ((result = sqlite3_step (stmt)) == SQLITE_ROW) |
1207 | - count = sqlite3_column_int64(stmt, 0); |
1208 | + count = sqlite3_column_int64(stmt, 0); |
1209 | |
1210 | sqlite3_clear_bindings (stmt); |
1211 | sqlite3_reset (stmt); |
1212 | @@ -599,14 +1066,13 @@ |
1213 | } |
1214 | |
1215 | static gint64 |
1216 | -midori_array_count_recursive_by_id (KatzeArray* bookmarks, |
1217 | - const gchar* condition, |
1218 | - const gchar* value, |
1219 | - gint64 id, |
1220 | - gboolean recursive) |
1221 | +midori_bookmarks_db_count_recursive_by_id (MidoriBookmarksDb* bookmarks, |
1222 | + const gchar* condition, |
1223 | + const gchar* value, |
1224 | + gint64 id, |
1225 | + gboolean recursive) |
1226 | { |
1227 | gint64 count = -1; |
1228 | - sqlite3* db; |
1229 | gchar* sqlcmd; |
1230 | char* sqlcmd_value; |
1231 | sqlite3_stmt* stmt; |
1232 | @@ -615,30 +1081,29 @@ |
1233 | GList* iter_ids; |
1234 | |
1235 | g_return_val_if_fail (condition, -1); |
1236 | - g_return_val_if_fail (KATZE_IS_ARRAY (bookmarks), -1); |
1237 | - db = g_object_get_data (G_OBJECT (bookmarks), "db"); |
1238 | - g_return_val_if_fail (db != NULL, -1); |
1239 | + g_return_val_if_fail (MIDORI_BOOKMARKS_DB (bookmarks), -1); |
1240 | + g_return_val_if_fail (bookmarks->db != NULL, -1); |
1241 | |
1242 | g_assert(!strstr("parentid", condition)); |
1243 | |
1244 | if (id > 0) |
1245 | - sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks " |
1246 | - "WHERE parentid = %" G_GINT64_FORMAT " AND %s", |
1247 | - id, |
1248 | - condition); |
1249 | + sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks " |
1250 | + "WHERE parentid = %" G_GINT64_FORMAT " AND %s", |
1251 | + id, |
1252 | + condition); |
1253 | else |
1254 | - sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks " |
1255 | - "WHERE parentid IS NULL AND %s ", |
1256 | - condition); |
1257 | + sqlcmd = g_strdup_printf ("SELECT COUNT(*) FROM bookmarks " |
1258 | + "WHERE parentid IS NULL AND %s ", |
1259 | + condition); |
1260 | |
1261 | if (strstr (condition, "%q")) |
1262 | { |
1263 | sqlcmd_value = sqlite3_mprintf (sqlcmd, value ? value : ""); |
1264 | - count = count_from_sqlite (db, sqlcmd_value); |
1265 | + count = midori_bookmarks_db_count_from_sqlite (bookmarks->db, sqlcmd_value); |
1266 | sqlite3_free (sqlcmd_value); |
1267 | } |
1268 | else |
1269 | - count = count_from_sqlite (db, sqlcmd); |
1270 | + count = midori_bookmarks_db_count_from_sqlite (bookmarks->db, sqlcmd); |
1271 | |
1272 | g_free (sqlcmd); |
1273 | |
1274 | @@ -648,28 +1113,28 @@ |
1275 | ids = NULL; |
1276 | |
1277 | if (id > 0) |
1278 | - sqlcmd_value = sqlite3_mprintf ( |
1279 | - "SELECT id FROM bookmarks " |
1280 | - "WHERE parentid = %" G_GINT64_FORMAT " AND uri = ''", id); |
1281 | + sqlcmd_value = sqlite3_mprintf ( |
1282 | + "SELECT id FROM bookmarks " |
1283 | + "WHERE parentid = %" G_GINT64_FORMAT " AND uri = ''", id); |
1284 | else |
1285 | - sqlcmd_value = sqlite3_mprintf ( |
1286 | - "SELECT id FROM bookmarks " |
1287 | - "WHERE parentid IS NULL AND uri = ''"); |
1288 | + sqlcmd_value = sqlite3_mprintf ( |
1289 | + "SELECT id FROM bookmarks " |
1290 | + "WHERE parentid IS NULL AND uri = ''"); |
1291 | |
1292 | - if (sqlite3_prepare_v2 (db, sqlcmd_value, -1, &stmt, NULL) == SQLITE_OK) |
1293 | + if (sqlite3_prepare_v2 (bookmarks->db, sqlcmd_value, -1, &stmt, NULL) == SQLITE_OK) |
1294 | { |
1295 | - g_assert (sqlite3_column_count (stmt) == 1); |
1296 | - |
1297 | - if ((result = sqlite3_step (stmt)) == SQLITE_ROW) |
1298 | - { |
1299 | - gint64* pid = g_new (gint64, 1); |
1300 | - |
1301 | - *pid = sqlite3_column_int64(stmt, 0); |
1302 | - ids = g_list_append (ids, pid); |
1303 | - } |
1304 | - |
1305 | - sqlite3_clear_bindings (stmt); |
1306 | - sqlite3_reset (stmt); |
1307 | + g_assert (sqlite3_column_count (stmt) == 1); |
1308 | + |
1309 | + if ((result = sqlite3_step (stmt)) == SQLITE_ROW) |
1310 | + { |
1311 | + gint64* pid = g_new (gint64, 1); |
1312 | + |
1313 | + *pid = sqlite3_column_int64(stmt, 0); |
1314 | + ids = g_list_append (ids, pid); |
1315 | + } |
1316 | + |
1317 | + sqlite3_clear_bindings (stmt); |
1318 | + sqlite3_reset (stmt); |
1319 | } |
1320 | |
1321 | sqlite3_free (sqlcmd_value); |
1322 | @@ -677,29 +1142,29 @@ |
1323 | iter_ids = ids; |
1324 | while (iter_ids) |
1325 | { |
1326 | - gint64 sub_count = midori_array_count_recursive_by_id (bookmarks, |
1327 | - condition, |
1328 | - value, |
1329 | - *(gint64*)(iter_ids->data), |
1330 | - recursive); |
1331 | - |
1332 | - if (sub_count < 0) |
1333 | - { |
1334 | - g_list_free_full (ids, g_free); |
1335 | - return -1; |
1336 | - } |
1337 | - |
1338 | - count += sub_count; |
1339 | - iter_ids = g_list_next (iter_ids); |
1340 | + gint64 sub_count = midori_bookmarks_db_count_recursive_by_id (bookmarks, |
1341 | + condition, |
1342 | + value, |
1343 | + *(gint64*)(iter_ids->data), |
1344 | + recursive); |
1345 | + |
1346 | + if (sub_count < 0) |
1347 | + { |
1348 | + g_list_free_full (ids, g_free); |
1349 | + return -1; |
1350 | + } |
1351 | + |
1352 | + count += sub_count; |
1353 | + iter_ids = g_list_next (iter_ids); |
1354 | } |
1355 | - |
1356 | + |
1357 | g_list_free_full (ids, g_free); |
1358 | return count; |
1359 | } |
1360 | |
1361 | /** |
1362 | - * midori_array_count_recursive: |
1363 | - * @array: the main bookmark array |
1364 | + * midori_bookmarks_db_count_recursive: |
1365 | + * @bookmarks: the main bookmark array |
1366 | * @condition: condition, like "folder = '%q'" |
1367 | * @value: a value to be inserted if @condition contains %q |
1368 | * @recursive: if %TRUE include children |
1369 | @@ -709,19 +1174,19 @@ |
1370 | * Since: 0.5.2 |
1371 | **/ |
1372 | gint64 |
1373 | -midori_array_count_recursive (KatzeArray* bookmarks, |
1374 | - const gchar* condition, |
1375 | - const gchar* value, |
1376 | - KatzeItem* folder, |
1377 | - gboolean recursive) |
1378 | +midori_bookmarks_db_count_recursive (MidoriBookmarksDb* bookmarks, |
1379 | + const gchar* condition, |
1380 | + const gchar* value, |
1381 | + KatzeItem* folder, |
1382 | + gboolean recursive) |
1383 | { |
1384 | gint64 id = -1; |
1385 | |
1386 | g_return_val_if_fail (!folder || KATZE_ITEM_IS_FOLDER (folder), -1); |
1387 | - |
1388 | + |
1389 | id = folder ? katze_item_get_meta_integer (folder, "id") : 0; |
1390 | |
1391 | - return midori_array_count_recursive_by_id (bookmarks, condition, |
1392 | - value, id, |
1393 | - recursive); |
1394 | + return midori_bookmarks_db_count_recursive_by_id (bookmarks, condition, |
1395 | + value, id, |
1396 | + recursive); |
1397 | } |
1398 | |
1399 | === modified file 'midori/midori-bookmarks-db.h' |
1400 | --- midori/midori-bookmarks-db.h 2013-09-08 10:53:32 +0000 |
1401 | +++ midori/midori-bookmarks-db.h 2013-09-17 19:35:27 +0000 |
1402 | @@ -16,33 +16,60 @@ |
1403 | #include <sqlite3.h> |
1404 | #include <katze/katze.h> |
1405 | |
1406 | -KatzeArray* |
1407 | -midori_bookmarks_new (char** errmsg); |
1408 | - |
1409 | -void |
1410 | -midori_bookmarks_on_quit (KatzeArray* array); |
1411 | - |
1412 | -void |
1413 | -midori_array_update_item (KatzeArray* bookmarks, KatzeItem* item); |
1414 | - |
1415 | -void |
1416 | -midori_bookmarks_import_array (KatzeArray* bookmarks, |
1417 | - KatzeArray* array, |
1418 | - gint64 parentid); |
1419 | - |
1420 | -KatzeArray* |
1421 | -midori_array_query_recursive (KatzeArray* bookmarks, |
1422 | - const gchar* fields, |
1423 | - const gchar* condition, |
1424 | - const gchar* value, |
1425 | - gboolean recursive); |
1426 | +G_BEGIN_DECLS |
1427 | + |
1428 | +#define TYPE_MIDORI_BOOKMARKS_DB \ |
1429 | + (midori_bookmarks_db_get_type ()) |
1430 | +#define MIDORI_BOOKMARKS_DB(obj) \ |
1431 | + (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDb)) |
1432 | +#define MIDORI_BOOKMARKS_DB_CLASS(klass) \ |
1433 | + (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDbClass)) |
1434 | +#define IS_MIDORI_BOOKMARKS_DB(obj) \ |
1435 | + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_MIDORI_BOOKMARKS_DB)) |
1436 | +#define IS_MIDORI_BOOKMARKS_DB_CLASS(klass) \ |
1437 | + (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_MIDORI_BOOKMARKS_DB)) |
1438 | +#define MIDORI_BOOKMARKS_DB_GET_CLASS(obj) \ |
1439 | + (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_MIDORI_BOOKMARKS_DB, MidoriBookmarksDbClass)) |
1440 | + |
1441 | +typedef struct _MidoriBookmarksDb MidoriBookmarksDb; |
1442 | +typedef struct _MidoriBookmarksDbClass MidoriBookmarksDbClass; |
1443 | + |
1444 | +GType |
1445 | +midori_bookmarks_db_get_type (void) G_GNUC_CONST; |
1446 | + |
1447 | +MidoriBookmarksDb* |
1448 | +midori_bookmarks_db_new (char** errmsg); |
1449 | + |
1450 | +void |
1451 | +midori_bookmarks_db_on_quit (MidoriBookmarksDb* array); |
1452 | + |
1453 | +void |
1454 | +midori_bookmarks_db_add_item (MidoriBookmarksDb* bookmarks, KatzeItem* item); |
1455 | + |
1456 | +void |
1457 | +midori_bookmarks_db_update_item (MidoriBookmarksDb* bookmarks, KatzeItem* item); |
1458 | + |
1459 | +void |
1460 | +midori_bookmarks_db_remove_item (MidoriBookmarksDb* bookmarks, KatzeItem* item); |
1461 | + |
1462 | +void |
1463 | +midori_bookmarks_db_import_array (MidoriBookmarksDb* bookmarks, |
1464 | + KatzeArray* array, |
1465 | + gint64 parentid); |
1466 | + |
1467 | +KatzeArray* |
1468 | +midori_bookmarks_db_query_recursive (MidoriBookmarksDb* bookmarks, |
1469 | + const gchar* fields, |
1470 | + const gchar* condition, |
1471 | + const gchar* value, |
1472 | + gboolean recursive); |
1473 | |
1474 | gint64 |
1475 | -midori_array_count_recursive (KatzeArray* bookmarks, |
1476 | - const gchar* condition, |
1477 | - const gchar* value, |
1478 | - KatzeItem* folder, |
1479 | - gboolean recursive); |
1480 | +midori_bookmarks_db_count_recursive (MidoriBookmarksDb* bookmarks, |
1481 | + const gchar* condition, |
1482 | + const gchar* value, |
1483 | + KatzeItem* folder, |
1484 | + gboolean recursive); |
1485 | |
1486 | gint64 |
1487 | midori_bookmarks_insert_item_db (sqlite3* db, |
1488 | |
1489 | === modified file 'midori/midori-browser.c' |
1490 | --- midori/midori-browser.c 2013-09-16 22:00:41 +0000 |
1491 | +++ midori/midori-browser.c 2013-09-17 19:35:27 +0000 |
1492 | @@ -87,7 +87,7 @@ |
1493 | |
1494 | MidoriWebSettings* settings; |
1495 | KatzeArray* proxy_array; |
1496 | - KatzeArray* bookmarks; |
1497 | + MidoriBookmarksDb* bookmarks; |
1498 | KatzeArray* trash; |
1499 | KatzeArray* search_engines; |
1500 | KatzeArray* history; |
1501 | @@ -195,8 +195,8 @@ |
1502 | GtkToolbarStyle style); |
1503 | |
1504 | static void |
1505 | -midori_browser_set_bookmarks (MidoriBrowser* browser, |
1506 | - KatzeArray* bookmarks); |
1507 | +midori_browser_set_bookmarks (MidoriBrowser* browser, |
1508 | + MidoriBookmarksDb* bookmarks); |
1509 | |
1510 | static void |
1511 | midori_browser_add_speed_dial (MidoriBrowser* browser); |
1512 | @@ -863,7 +863,7 @@ |
1513 | } |
1514 | |
1515 | static GtkWidget* |
1516 | -midori_bookmark_folder_button_new (KatzeArray* array, |
1517 | +midori_bookmark_folder_button_new (MidoriBookmarksDb* array, |
1518 | gint64 selected_parentid) |
1519 | { |
1520 | GtkTreeStore* model; |
1521 | @@ -1231,18 +1231,9 @@ |
1522 | katze_item_set_meta_integer (bookmark, "parentid", selected); |
1523 | |
1524 | if (new_bookmark) |
1525 | - katze_array_add_item (browser->bookmarks, bookmark); |
1526 | + midori_bookmarks_db_add_item (browser->bookmarks, bookmark); |
1527 | else |
1528 | - { |
1529 | - midori_array_update_item (browser->bookmarks, bookmark); |
1530 | - midori_browser_update_history (bookmark, "bookmark", "modify"); |
1531 | - |
1532 | - if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_toolbar))) |
1533 | - if (!gtk_widget_get_visible (browser->bookmarkbar)) |
1534 | - _action_set_active (browser, "Bookmarkbar", TRUE); |
1535 | - if (gtk_widget_get_visible (browser->bookmarkbar)) |
1536 | - midori_bookmarkbar_populate (browser); |
1537 | - } |
1538 | + midori_bookmarks_db_update_item (browser->bookmarks, bookmark); |
1539 | |
1540 | return_status = TRUE; |
1541 | } |
1542 | @@ -2545,7 +2536,7 @@ |
1543 | "bookmarks", |
1544 | "Bookmarks", |
1545 | "The bookmarks folder, containing all bookmarks", |
1546 | - KATZE_TYPE_ARRAY, |
1547 | + TYPE_MIDORI_BOOKMARKS_DB, |
1548 | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); |
1549 | |
1550 | /** |
1551 | @@ -3273,8 +3264,8 @@ |
1552 | else |
1553 | condition = "parentid = %q"; |
1554 | |
1555 | - bookmarks = midori_array_query_recursive (browser->bookmarks, |
1556 | - "id, title, parentid, uri, app, pos_panel, pos_bar", condition, id, FALSE); |
1557 | + bookmarks = midori_bookmarks_db_query_recursive (browser->bookmarks, |
1558 | + "id, title, parentid, uri, app, pos_panel, pos_bar", condition, id, FALSE); |
1559 | if (!bookmarks) |
1560 | return FALSE; |
1561 | |
1562 | @@ -4308,7 +4299,7 @@ |
1563 | KatzeItem* item; |
1564 | |
1565 | item = (KatzeItem*)g_object_get_data (G_OBJECT (menuitem), "KatzeItem"); |
1566 | - katze_array_remove_item (browser->bookmarks, item); |
1567 | + midori_bookmarks_db_remove_item (browser->bookmarks, item); |
1568 | } |
1569 | |
1570 | static void |
1571 | @@ -4320,7 +4311,7 @@ |
1572 | MidoriContextAction* menu = midori_context_action_new ("BookmarkContextMenu", NULL, NULL, NULL); |
1573 | if (KATZE_ITEM_IS_FOLDER (item)) |
1574 | { |
1575 | - gint child_bookmarks_count = midori_array_count_recursive (browser->bookmarks, |
1576 | + gint child_bookmarks_count = midori_bookmarks_db_count_recursive (browser->bookmarks, |
1577 | "uri <> ''", NULL, item, FALSE); |
1578 | |
1579 | GtkAction* action = gtk_action_new ("BookmarkOpenAllTabs", _("Open all in _Tabs"), NULL, STOCK_TAB_NEW); |
1580 | @@ -4590,8 +4581,7 @@ |
1581 | if (error) |
1582 | g_error_free (error); |
1583 | } |
1584 | - midori_bookmarks_import_array (browser->bookmarks, bookmarks, selected); |
1585 | - |
1586 | + midori_bookmarks_db_import_array (browser->bookmarks, bookmarks, selected); |
1587 | g_object_unref (bookmarks); |
1588 | g_free (path); |
1589 | } |
1590 | @@ -4645,7 +4635,7 @@ |
1591 | return; |
1592 | |
1593 | error = NULL; |
1594 | - bookmarks = midori_array_query_recursive (browser->bookmarks, |
1595 | + bookmarks = midori_bookmarks_db_query_recursive (browser->bookmarks, |
1596 | "*", "parentid IS NULL", NULL, TRUE); |
1597 | if (!midori_array_to_file (bookmarks, path, format, &error)) |
1598 | { |
1599 | @@ -7060,6 +7050,16 @@ |
1600 | } |
1601 | |
1602 | static void |
1603 | +midori_bookmarkbar_update_item_cb (KatzeArray* bookmarks, |
1604 | + KatzeItem* item, |
1605 | + MidoriBrowser* browser) |
1606 | +{ |
1607 | + if (gtk_widget_get_visible (browser->bookmarkbar)) |
1608 | + midori_bookmarkbar_populate (browser); |
1609 | + midori_browser_update_history (item, "bookmark", "modify"); |
1610 | +} |
1611 | + |
1612 | +static void |
1613 | midori_bookmarkbar_remove_item_cb (KatzeArray* bookmarks, |
1614 | KatzeItem* item, |
1615 | MidoriBrowser* browser) |
1616 | @@ -7091,8 +7091,8 @@ |
1617 | gtk_toolbar_insert (GTK_TOOLBAR (browser->bookmarkbar), |
1618 | gtk_separator_tool_item_new (), -1); |
1619 | |
1620 | - array = midori_array_query_recursive (browser->bookmarks, |
1621 | - "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "toolbar = 1", NULL, FALSE); |
1622 | + array = midori_bookmarks_db_query_recursive (browser->bookmarks, |
1623 | + "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "toolbar = 1", NULL, FALSE); |
1624 | if (!array) |
1625 | { |
1626 | _action_set_sensitive (browser, "BookmarkAdd", FALSE); |
1627 | @@ -7132,7 +7132,7 @@ |
1628 | |
1629 | static void |
1630 | midori_browser_set_bookmarks (MidoriBrowser* browser, |
1631 | - KatzeArray* bookmarks) |
1632 | + MidoriBookmarksDb* bookmarks) |
1633 | { |
1634 | MidoriWebSettings* settings; |
1635 | |
1636 | @@ -7141,6 +7141,8 @@ |
1637 | g_signal_handlers_disconnect_by_func (browser->bookmarks, |
1638 | midori_bookmarkbar_add_item_cb, browser); |
1639 | g_signal_handlers_disconnect_by_func (browser->bookmarks, |
1640 | + midori_bookmarkbar_update_item_cb, browser); |
1641 | + g_signal_handlers_disconnect_by_func (browser->bookmarks, |
1642 | midori_bookmarkbar_remove_item_cb, browser); |
1643 | } |
1644 | |
1645 | @@ -7174,6 +7176,8 @@ |
1646 | g_object_notify (G_OBJECT (settings), "show-bookmarkbar"); |
1647 | g_signal_connect_after (bookmarks, "add-item", |
1648 | G_CALLBACK (midori_bookmarkbar_add_item_cb), browser); |
1649 | + g_signal_connect_after (bookmarks, "update-item", |
1650 | + G_CALLBACK (midori_bookmarkbar_update_item_cb), browser); |
1651 | g_signal_connect_after (bookmarks, "remove-item", |
1652 | G_CALLBACK (midori_bookmarkbar_remove_item_cb), browser); |
1653 | } |
1654 | |
1655 | === modified file 'midori/midori-frontend.c' |
1656 | --- midori/midori-frontend.c 2013-09-08 11:09:40 +0000 |
1657 | +++ midori/midori-frontend.c 2013-09-17 19:35:27 +0000 |
1658 | @@ -487,9 +487,9 @@ |
1659 | } |
1660 | g_free (uri); |
1661 | |
1662 | - KatzeArray* bookmarks; |
1663 | + MidoriBookmarksDb* bookmarks; |
1664 | gchar* errmsg = NULL; |
1665 | - if (!(bookmarks = midori_bookmarks_new (&errmsg))) |
1666 | + if (!(bookmarks = midori_bookmarks_db_new (&errmsg))) |
1667 | { |
1668 | g_string_append_printf (error_messages, |
1669 | _("Bookmarks couldn't be loaded: %s\n"), errmsg); |
1670 | @@ -596,11 +596,11 @@ |
1671 | midori_normal_app_on_quit (MidoriApp* app) |
1672 | { |
1673 | MidoriWebSettings* settings = katze_object_get_object (app, "settings"); |
1674 | - KatzeArray* bookmarks = katze_object_get_object (app, "bookmarks"); |
1675 | + MidoriBookmarksDb* bookmarks = katze_object_get_object (app, "bookmarks"); |
1676 | KatzeArray* history = katze_object_get_object (app, "history"); |
1677 | |
1678 | g_object_notify (G_OBJECT (settings), "load-on-startup"); |
1679 | - midori_bookmarks_on_quit (bookmarks); |
1680 | + midori_bookmarks_db_on_quit (bookmarks); |
1681 | midori_history_on_quit (history, settings); |
1682 | midori_private_data_on_quit (settings); |
1683 | |
1684 | |
1685 | === modified file 'panels/midori-bookmarks.c' |
1686 | --- panels/midori-bookmarks.c 2013-09-08 11:09:40 +0000 |
1687 | +++ panels/midori-bookmarks.c 2013-09-17 19:35:27 +0000 |
1688 | @@ -45,7 +45,7 @@ |
1689 | GtkWidget* delete; |
1690 | GtkWidget* treeview; |
1691 | MidoriApp* app; |
1692 | - KatzeArray* array; |
1693 | + MidoriBookmarksDb* bookmarks_db; |
1694 | |
1695 | gint filter_timeout; |
1696 | gchar* filter; |
1697 | @@ -125,6 +125,7 @@ |
1698 | return STOCK_BOOKMARKS; |
1699 | } |
1700 | |
1701 | +#if 0 /* Make sure the following function is never used */ |
1702 | /* TODO: Function never used */ |
1703 | void |
1704 | midori_bookmarks_export_array_db (sqlite3* db, |
1705 | @@ -138,7 +139,7 @@ |
1706 | gchar* parent_id; |
1707 | |
1708 | parent_id = g_strdup_printf ("%" G_GINT64_FORMAT, parentid); |
1709 | - if (!(root_array = midori_array_query_recursive (array, "*", "parentid = %q", parent_id, FALSE))) |
1710 | + if (!(root_array = midori_bookmarks_db_query_recursive (array, "*", "parentid = %q", parent_id, FALSE))) |
1711 | { |
1712 | g_free (parent_id); |
1713 | return; |
1714 | @@ -160,6 +161,7 @@ |
1715 | g_free (parent_id); |
1716 | g_list_free (list); |
1717 | } |
1718 | +#endif /* 0 */ |
1719 | |
1720 | static KatzeArray* |
1721 | midori_bookmarks_read_from_db (MidoriBookmarks* bookmarks, |
1722 | @@ -169,21 +171,21 @@ |
1723 | KatzeArray* array; |
1724 | |
1725 | if (keyword && *keyword) |
1726 | - array = midori_array_query_recursive (bookmarks->array, |
1727 | - "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "title LIKE '%%%q%%'", keyword, FALSE); |
1728 | + array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db, |
1729 | + "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "title LIKE '%%%q%%'", keyword, FALSE); |
1730 | else |
1731 | { |
1732 | if (parentid > 0) |
1733 | { |
1734 | gchar* parent_id = g_strdup_printf ("%" G_GINT64_FORMAT, parentid); |
1735 | - array = midori_array_query_recursive (bookmarks->array, |
1736 | - "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid = %q", parent_id, FALSE); |
1737 | + array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db, |
1738 | + "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid = %q", parent_id, FALSE); |
1739 | |
1740 | g_free (parent_id); |
1741 | } |
1742 | else |
1743 | - array = midori_array_query_recursive (bookmarks->array, |
1744 | - "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid IS NULL", NULL, FALSE); |
1745 | + array = midori_bookmarks_db_query_recursive (bookmarks->bookmarks_db, |
1746 | + "id, parentid, title, uri, desc, app, toolbar, pos_panel, pos_bar", "parentid IS NULL", NULL, FALSE); |
1747 | } |
1748 | return array ? array : katze_array_new (KATZE_TYPE_ITEM); |
1749 | } |
1750 | @@ -274,9 +276,9 @@ |
1751 | else |
1752 | parentid = 0; |
1753 | |
1754 | - katze_array_remove_item (bookmarks->array, item); |
1755 | katze_item_set_meta_integer (item, "parentid", parentid); |
1756 | - katze_array_add_item (bookmarks->array, item); |
1757 | + |
1758 | + midori_bookmarks_db_update_item (bookmarks->bookmarks_db, item); |
1759 | |
1760 | g_object_unref (item); |
1761 | if (new_parent) |
1762 | @@ -416,9 +418,9 @@ |
1763 | |
1764 | if (KATZE_ITEM_IS_FOLDER (item)) |
1765 | { |
1766 | - gint child_folders_count = midori_array_count_recursive (bookmarks->array, |
1767 | + gint child_folders_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1768 | "uri = ''", NULL, item, FALSE); |
1769 | - gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array, |
1770 | + gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1771 | "uri <> ''", NULL, item, FALSE); |
1772 | gchar* child_folders_str = midori_bookmarks_statusbar_subfolders_str (child_folders_count); |
1773 | gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count); |
1774 | @@ -451,9 +453,9 @@ |
1775 | } |
1776 | else |
1777 | { |
1778 | - gint child_folders_count = midori_array_count_recursive (bookmarks->array, |
1779 | + gint child_folders_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1780 | "uri = ''", NULL, NULL, FALSE); |
1781 | - gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array, |
1782 | + gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1783 | "uri <> ''", NULL, NULL, FALSE); |
1784 | gchar* child_folders_str = midori_bookmarks_statusbar_subfolders_str (child_folders_count); |
1785 | gchar* child_bookmarks_str = midori_bookmarks_statusbar_bookmarks_str (child_bookmarks_count); |
1786 | @@ -499,10 +501,10 @@ |
1787 | |
1788 | /* Manually remove the iter and block clearing the treeview */ |
1789 | gtk_tree_store_remove (GTK_TREE_STORE (model), &iter); |
1790 | - g_signal_handlers_block_by_func (bookmarks->array, |
1791 | + g_signal_handlers_block_by_func (bookmarks->bookmarks_db, |
1792 | midori_bookmarks_remove_item_cb, bookmarks); |
1793 | - katze_array_remove_item (bookmarks->array, item); |
1794 | - g_signal_handlers_unblock_by_func (bookmarks->array, |
1795 | + midori_bookmarks_db_remove_item (bookmarks->bookmarks_db, item); |
1796 | + g_signal_handlers_unblock_by_func (bookmarks->bookmarks_db, |
1797 | midori_bookmarks_remove_item_cb, bookmarks); |
1798 | g_object_unref (item); |
1799 | } |
1800 | @@ -585,9 +587,9 @@ |
1801 | GtkTreeModel* model; |
1802 | |
1803 | model = gtk_tree_view_get_model (GTK_TREE_VIEW (bookmarks->treeview)); |
1804 | - if (bookmarks->array) |
1805 | + if (bookmarks->bookmarks_db) |
1806 | { |
1807 | - g_object_unref (bookmarks->array); |
1808 | + g_object_unref (bookmarks->bookmarks_db); |
1809 | gtk_tree_store_clear (GTK_TREE_STORE (model)); |
1810 | } |
1811 | katze_assign (bookmarks->app, app); |
1812 | @@ -595,13 +597,13 @@ |
1813 | return; |
1814 | |
1815 | g_object_ref (app); |
1816 | - bookmarks->array = katze_object_get_object (app, "bookmarks"); |
1817 | + bookmarks->bookmarks_db = katze_object_get_object (app, "bookmarks"); |
1818 | midori_bookmarks_read_from_db_to_model (bookmarks, GTK_TREE_STORE (model), NULL, 0, NULL); |
1819 | - g_signal_connect_after (bookmarks->array, "add-item", |
1820 | - G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); |
1821 | - g_signal_connect (bookmarks->array, "remove-item", |
1822 | + g_signal_connect_after (bookmarks->bookmarks_db, "add-item", |
1823 | + G_CALLBACK (midori_bookmarks_add_item_cb), bookmarks); |
1824 | + g_signal_connect (bookmarks->bookmarks_db, "remove-item", |
1825 | G_CALLBACK (midori_bookmarks_remove_item_cb), bookmarks); |
1826 | - g_signal_connect (bookmarks->array, "update", |
1827 | + g_signal_connect (bookmarks->bookmarks_db, "update", |
1828 | G_CALLBACK (midori_bookmarks_update_cb), bookmarks); |
1829 | g_signal_connect_after (model, "row-changed", |
1830 | G_CALLBACK (midori_bookmarks_row_changed_cb), |
1831 | @@ -835,7 +837,7 @@ |
1832 | menu = gtk_menu_new (); |
1833 | if (KATZE_ITEM_IS_FOLDER (item)) |
1834 | { |
1835 | - gint child_bookmarks_count = midori_array_count_recursive (bookmarks->array, |
1836 | + gint child_bookmarks_count = midori_bookmarks_db_count_recursive (bookmarks->bookmarks_db, |
1837 | "uri <> ''", NULL, item, FALSE); |
1838 | |
1839 | midori_bookmarks_popup_item (menu, |
1840 | |
1841 | === modified file 'tests/bookmarks.c' |
1842 | --- tests/bookmarks.c 2012-11-25 15:37:41 +0000 |
1843 | +++ tests/bookmarks.c 2013-09-17 19:35:27 +0000 |
1844 | @@ -10,11 +10,11 @@ |
1845 | */ |
1846 | |
1847 | #include "midori.h" |
1848 | -#include "panels/midori-bookmarks.h" |
1849 | +#include "midori-bookmarks-db.h" |
1850 | |
1851 | typedef struct |
1852 | { |
1853 | - KatzeArray* db_bookmarks; |
1854 | + MidoriBookmarksDb* db_bookmarks; |
1855 | KatzeArray* test_bookmarks; |
1856 | } BookmarksFixture; |
1857 | |
1858 | @@ -37,7 +37,7 @@ |
1859 | KatzeArray* folder; |
1860 | gchar *errmsg = NULL; |
1861 | |
1862 | - if (!(fixture->db_bookmarks = midori_bookmarks_new (&errmsg))) |
1863 | + if (!(fixture->db_bookmarks = midori_bookmarks_db_new (&errmsg))) |
1864 | g_error ("Bookmarks couldn't be loaded: %s\n", errmsg); |
1865 | g_assert (errmsg == NULL); |
1866 | g_assert (g_object_get_data (G_OBJECT (fixture->db_bookmarks), "db")); |
1867 | @@ -84,8 +84,8 @@ |
1868 | fixture_teardown (BookmarksFixture* fixture, |
1869 | const TestParameters *params) |
1870 | { |
1871 | - midori_bookmarks_on_quit (fixture->db_bookmarks); |
1872 | - g_object_unref (fixture->db_bookmarks); |
1873 | + midori_bookmarks_db_on_quit (fixture->db_bookmarks); |
1874 | + /* g_object_unref (fixture->db_bookmarks); */ |
1875 | g_object_unref (fixture->test_bookmarks); |
1876 | } |
1877 | |
1878 | @@ -112,7 +112,7 @@ |
1879 | /* NB: assumes "title" is unique in a set */ |
1880 | static void |
1881 | compare_test_and_db (KatzeArray* test_bookmarks, |
1882 | - KatzeArray* db_bookmarks, |
1883 | + MidoriBookmarksDb* db_bookmarks, |
1884 | gboolean verbose) |
1885 | { |
1886 | KatzeArray* db_items; |
1887 | @@ -127,7 +127,7 @@ |
1888 | g_print ("----------\n"); |
1889 | } |
1890 | |
1891 | - db_items = midori_array_query_recursive (db_bookmarks, |
1892 | + db_items = midori_bookmarks_db_query_recursive (db_bookmarks, |
1893 | "*", "title='%q'", katze_item_get_name (test_item), FALSE); |
1894 | |
1895 | /* FIXME g_assert_cmpint (katze_array_get_length (db_items), ==, 1); */ |
1896 | @@ -142,28 +142,33 @@ |
1897 | } |
1898 | |
1899 | static void |
1900 | +print_bookmarks (KatzeArray* test_bookmarks) |
1901 | +{ |
1902 | + KatzeItem* item; |
1903 | + GList* list; |
1904 | + KATZE_ARRAY_FOREACH_ITEM_L (item, test_bookmarks, list) |
1905 | + { |
1906 | + print_bookmark (item); |
1907 | + g_print ("----------\n"); |
1908 | + |
1909 | + if (KATZE_ITEM_IS_FOLDER(item)) |
1910 | + print_bookmarks (KATZE_ARRAY (item)); |
1911 | + } |
1912 | + g_list_free (list); |
1913 | +} |
1914 | + |
1915 | +static void |
1916 | insert_bookmarks (KatzeArray* test_bookmarks, |
1917 | - KatzeArray* db_bookmarks, |
1918 | + MidoriBookmarksDb* db_bookmarks, |
1919 | gboolean verbose) |
1920 | { |
1921 | - KatzeItem* item; |
1922 | - GList* list; |
1923 | - sqlite3 *db = g_object_get_data (G_OBJECT (db_bookmarks), "db"); |
1924 | |
1925 | - KATZE_ARRAY_FOREACH_ITEM_L (item, test_bookmarks, list) |
1926 | + if (verbose) |
1927 | { |
1928 | - if (verbose) |
1929 | - { |
1930 | - print_bookmark (item); |
1931 | - g_print ("----------\n"); |
1932 | - } |
1933 | - |
1934 | - midori_bookmarks_insert_item_db (db, item, 0); |
1935 | - |
1936 | - if (KATZE_ITEM_IS_FOLDER(item)) |
1937 | - insert_bookmarks (KATZE_ARRAY (item), db_bookmarks, verbose); |
1938 | + print_bookmarks (test_bookmarks); |
1939 | } |
1940 | - g_list_free (list); |
1941 | + |
1942 | + midori_bookmarks_db_import_array (db_bookmarks, test_bookmarks, 0); |
1943 | } |
1944 | |
1945 | static void |
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.