3f1acbc348f51cc8692e71fbdf933234293cbc0c
[profile/ivi/org.tizen.browser.git] / src / database / browser-bookmark-db.cpp
1 /*\r
2  * Copyright 2012  Samsung Electronics Co., Ltd\r
3  *\r
4  * Licensed under the Flora License, Version 1.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *    http://www.tizenopensource.org/license\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  *\r
16  */\r
17 \r
18 \r
19 using namespace std;\r
20 \r
21 #include "browser-bookmark-db.h"\r
22 \r
23 #define BOOKMARK_NORMAL 0\r
24 #define BOOKMARK_FOLDER 1\r
25 \r
26 sqlite3* Browser_Bookmark_DB::m_db_descriptor = NULL;\r
27 \r
28 Browser_Bookmark_DB::Browser_Bookmark_DB(void)\r
29 {\r
30         BROWSER_LOGD("[%s]", __func__);\r
31 }\r
32 \r
33 Browser_Bookmark_DB::~Browser_Bookmark_DB(void)\r
34 {\r
35         BROWSER_LOGD("[%s]", __func__);\r
36 }\r
37 \r
38 Eina_Bool Browser_Bookmark_DB::_open_db(void)\r
39 {\r
40         BROWSER_LOGD("[%s]", __func__);\r
41         int error = db_util_open(BROWSER_BOOKMARK_DB_PATH, &m_db_descriptor, DB_UTIL_REGISTER_HOOK_METHOD);\r
42         if (error != SQLITE_OK) {\r
43                 db_util_close(m_db_descriptor);\r
44                 m_db_descriptor = NULL;\r
45                 return EINA_FALSE;\r
46         }\r
47 \r
48         return EINA_TRUE;\r
49 }\r
50 \r
51 Eina_Bool Browser_Bookmark_DB::_close_db(void)\r
52 {\r
53         BROWSER_LOGD("[%s]", __func__);\r
54         if (m_db_descriptor)\r
55         {\r
56                 int error = db_util_close(m_db_descriptor);\r
57                 if (error != SQLITE_OK) {\r
58                         BROWSER_LOGE("db_util_close error");\r
59                         m_db_descriptor = NULL;\r
60                         return EINA_FALSE;\r
61                 }\r
62                 m_db_descriptor = NULL;\r
63         }\r
64 \r
65         return EINA_TRUE;\r
66 }\r
67 \r
68 Eina_Bool Browser_Bookmark_DB::_get_last_index(int folder_id, int *last_index)\r
69 {\r
70         if (_open_db() == EINA_FALSE)\r
71                 return EINA_FALSE;\r
72 \r
73         std::string query = "select sequence from bookmarks where parent=? order by sequence desc";\r
74 \r
75         sqlite3_stmt *sqlite3_stmt = NULL;\r
76         int error = sqlite3_prepare_v2(m_db_descriptor, query.c_str(), -1, &sqlite3_stmt, NULL);\r
77         if (error != SQLITE_OK) {\r
78                 BROWSER_LOGD("SQL error=%d", error);\r
79                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
80                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
81                 _close_db();\r
82                 return EINA_FALSE;\r
83         }\r
84 \r
85         if (sqlite3_bind_int(sqlite3_stmt, 1, folder_id) != SQLITE_OK)\r
86                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
87 \r
88         if ((error = sqlite3_step(sqlite3_stmt)) == SQLITE_ROW || error == SQLITE_DONE)\r
89                 *last_index = sqlite3_column_int(sqlite3_stmt, 0);\r
90         else\r
91                 BROWSER_LOGE("sqlite3_step is failed. error=%d\n", error);\r
92 \r
93         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
94                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
95 \r
96         if (_close_db() == EINA_FALSE)\r
97                 BROWSER_LOGE("_close_db is failed.");\r
98 \r
99         return (error == SQLITE_DONE || error == SQLITE_ROW);\r
100 }\r
101 \r
102 Eina_Bool Browser_Bookmark_DB::delete_bookmark(int bookmark_id)\r
103 {\r
104         if (_open_db() == EINA_FALSE)\r
105                 return EINA_FALSE;\r
106 \r
107         sqlite3_stmt *sqlite3_stmt = NULL;\r
108         int error = sqlite3_prepare_v2(m_db_descriptor, "delete from bookmarks where id=?",\r
109                                         -1, &sqlite3_stmt, NULL);\r
110         if (error != SQLITE_OK) {\r
111                 BROWSER_LOGD("SQL error=%d", error);\r
112                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
113                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
114                 _close_db();\r
115                 return EINA_FALSE;\r
116         }\r
117 \r
118         if (sqlite3_bind_int(sqlite3_stmt, 1, bookmark_id) != SQLITE_OK)\r
119                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
120 \r
121         error = sqlite3_step(sqlite3_stmt);\r
122         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
123                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
124 \r
125         if (error != SQLITE_OK && error != SQLITE_DONE) {\r
126                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
127                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
128                 _close_db();\r
129                 return EINA_FALSE;\r
130         }\r
131 \r
132         if (_close_db() == EINA_FALSE)\r
133                 BROWSER_LOGE("_close_db is failed.");\r
134 \r
135         return (error == SQLITE_DONE);\r
136 }\r
137 \r
138 Eina_Bool Browser_Bookmark_DB::delete_folder(int folder_id)\r
139 {\r
140         delete_bookmark(folder_id);\r
141 \r
142         if (_open_db() == EINA_FALSE)\r
143                 return EINA_FALSE;\r
144 \r
145         sqlite3_stmt *sqlite3_stmt = NULL;\r
146         int error = sqlite3_prepare_v2(m_db_descriptor, "select id, type from bookmarks where parent=?",\r
147                                         -1, &sqlite3_stmt, NULL);\r
148         if (error != SQLITE_OK) {\r
149                 BROWSER_LOGD("SQL error=%d", error);\r
150                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
151                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
152                 _close_db();\r
153                 return EINA_FALSE;\r
154         }\r
155 \r
156         if (sqlite3_bind_int(sqlite3_stmt, 1, folder_id) != SQLITE_OK)\r
157                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
158 \r
159         std::vector<bookmark_item_type> item_type;\r
160         while ((error = sqlite3_step(sqlite3_stmt)) == SQLITE_ROW) {\r
161                 bookmark_item_type type;\r
162                 type.id = sqlite3_column_int(sqlite3_stmt, 0);\r
163                 type.is_folder = (sqlite3_column_int(sqlite3_stmt, 1) == BOOKMARK_FOLDER);\r
164                 item_type.push_back(type);\r
165         }\r
166 \r
167         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
168                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
169 \r
170         _close_db();\r
171 \r
172         for (std::vector<bookmark_item_type>::iterator iter = item_type.begin()\r
173                 ; iter != item_type.end() ; iter++) {\r
174                 if(iter->is_folder)\r
175                         delete_folder(iter->id);\r
176                 else\r
177                         delete_bookmark(iter->id);\r
178         }\r
179 \r
180         return EINA_TRUE;\r
181 }\r
182 \r
183 Eina_Bool Browser_Bookmark_DB::get_bookmark_id_by_title_url(int folder_id, const char *title,\r
184                                                                 const char *url, int *bookmark_id)\r
185 {\r
186         if (_open_db() == EINA_FALSE)\r
187                 return EINA_FALSE;\r
188 \r
189         sqlite3_stmt *sqlite3_stmt = NULL;\r
190         int error = sqlite3_prepare_v2(m_db_descriptor, "select id from bookmarks where parent=? and title=?",\r
191                                         -1, &sqlite3_stmt, NULL);\r
192         if (error != SQLITE_OK) {\r
193                 BROWSER_LOGD("SQL error=%d", error);\r
194                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
195                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
196                 _close_db();\r
197                 return EINA_FALSE;\r
198         }\r
199  \r
200         if (sqlite3_bind_int(sqlite3_stmt, 1, folder_id) != SQLITE_OK)\r
201                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
202         if (sqlite3_bind_text(sqlite3_stmt, 2, title, -1, NULL) != SQLITE_OK)\r
203                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
204 \r
205         error = sqlite3_step(sqlite3_stmt);\r
206         if (error != SQLITE_ROW) {\r
207                 BROWSER_LOGD("SQL error=%d", error);\r
208                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
209                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
210                 _close_db();\r
211                 return EINA_FALSE;\r
212         }\r
213 \r
214         *bookmark_id = sqlite3_column_int(sqlite3_stmt, 0);\r
215 \r
216         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
217                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
218 \r
219         _close_db();\r
220 \r
221         return (error == SQLITE_ROW);\r
222 }\r
223 \r
224 Eina_Bool Browser_Bookmark_DB::save_folder(const char* folder_name)\r
225 {\r
226         int last_index = 0;\r
227         Eina_Bool get_last_index_result = EINA_TRUE;\r
228         if (!_get_last_index(BROWSER_BOOKMARK_MAIN_FOLDER_ID, &last_index)) {\r
229                 BROWSER_LOGE("_get_last_index failed.\n");\r
230                 get_last_index_result = EINA_FALSE;\r
231         }\r
232 \r
233         if (_open_db() == EINA_FALSE)\r
234                 return EINA_FALSE;\r
235 \r
236         sqlite3_stmt *sqlite3_stmt = NULL;\r
237         int error = sqlite3_prepare_v2(m_db_descriptor, "insert into bookmarks (type, parent, title, creationdate, sequence, updatedate, editable) values (?, ?, ?, DATETIME('now'), ?, DATETIME('now'), 1)",\r
238                                         -1, &sqlite3_stmt, NULL);\r
239         if (error != SQLITE_OK) {\r
240                 BROWSER_LOGD("SQL error=%d", error);\r
241                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
242                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
243                 _close_db();\r
244                 return EINA_FALSE;\r
245         }\r
246 \r
247         if (sqlite3_bind_int(sqlite3_stmt, 1, 1) != SQLITE_OK)\r
248                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
249         if (sqlite3_bind_int(sqlite3_stmt, 2, BROWSER_BOOKMARK_MAIN_FOLDER_ID) != SQLITE_OK)\r
250                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
251         if (sqlite3_bind_text(sqlite3_stmt, 3, folder_name, -1, NULL) != SQLITE_OK)\r
252                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
253 \r
254         if (get_last_index_result) {\r
255                 if (sqlite3_bind_int(sqlite3_stmt, 4, last_index + 1) != SQLITE_OK)\r
256                         BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
257         } else {\r
258                 if (sqlite3_bind_int(sqlite3_stmt, 4, 1) != SQLITE_OK)\r
259                         BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
260         }\r
261 \r
262         error = sqlite3_step(sqlite3_stmt);\r
263 \r
264         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
265                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
266 \r
267         _close_db();\r
268 \r
269         return (error == SQLITE_DONE);\r
270 }\r
271 \r
272 Eina_Bool Browser_Bookmark_DB::save_bookmark(int folder_id, const char* title, const char* url)\r
273 {\r
274         if (!title || !url)\r
275                 return EINA_FALSE;\r
276 \r
277         int last_index = 0;\r
278         Eina_Bool get_last_index_result = EINA_TRUE;\r
279         if (!_get_last_index(folder_id, &last_index)) {\r
280                 BROWSER_LOGE("_get_last_index failed.\n");\r
281                 get_last_index_result = EINA_FALSE;\r
282         }\r
283 \r
284         if (_open_db() == EINA_FALSE)\r
285                 return EINA_FALSE;\r
286 \r
287         sqlite3_stmt *sqlite3_stmt = NULL;\r
288         int error = sqlite3_prepare_v2(m_db_descriptor, "insert into bookmarks (type, parent, address, title, creationdate, sequence, updatedate, editable) values (?, ?, ?, ?, DATETIME('now'), ?, DATETIME('now'), 1)",\r
289                                         -1, &sqlite3_stmt, NULL);\r
290         if (error != SQLITE_OK) {\r
291                 BROWSER_LOGD("SQL error=%d", error);\r
292                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
293                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
294                 _close_db();\r
295                 return EINA_FALSE;\r
296         }\r
297 \r
298         std::string title_to_save = "";\r
299         std::string url_to_save = "";\r
300 \r
301         title_to_save = title;\r
302         if (title_to_save.size() >= BROWSER_MAX_TITLE_LEN)\r
303                 title_to_save.resize(BROWSER_MAX_TITLE_LEN - 1);\r
304         url_to_save = url;\r
305         if (url_to_save.size() >= BROWSER_MAX_URL_LEN)\r
306                 url_to_save.resize(BROWSER_MAX_URL_LEN - 1);\r
307 \r
308         if (sqlite3_bind_int(sqlite3_stmt, 1, 0) != SQLITE_OK)\r
309                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
310         if (sqlite3_bind_int(sqlite3_stmt, 2, folder_id) != SQLITE_OK)\r
311                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
312         if (sqlite3_bind_text(sqlite3_stmt, 3, url_to_save.c_str(), -1, NULL) != SQLITE_OK)\r
313                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
314         if (sqlite3_bind_text(sqlite3_stmt, 4, title_to_save.c_str(), -1, NULL) != SQLITE_OK)\r
315                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
316 \r
317         if (get_last_index_result) {\r
318                 if (sqlite3_bind_int(sqlite3_stmt, 5, last_index + 1) != SQLITE_OK)\r
319                         BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
320         }\r
321         else {\r
322                 if (sqlite3_bind_int(sqlite3_stmt, 5, 1) != SQLITE_OK)\r
323                         BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
324         }\r
325 \r
326         error = sqlite3_step(sqlite3_stmt);\r
327 \r
328         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
329                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
330 \r
331         if (_close_db() == EINA_FALSE)\r
332                 BROWSER_LOGE("_close_db is failed.");\r
333 \r
334         return (error == SQLITE_DONE);\r
335 }\r
336 \r
337 Eina_Bool Browser_Bookmark_DB::is_full(void)\r
338 {\r
339         unsigned count = 0;\r
340 \r
341         if (_open_db() == EINA_FALSE)\r
342                 return EINA_FALSE;\r
343 \r
344         sqlite3_stmt *sqlite3_stmt = NULL;\r
345         int error = sqlite3_prepare_v2(m_db_descriptor, "select count(*) from bookmarks", -1, &sqlite3_stmt, NULL);\r
346         if (error != SQLITE_OK) {\r
347                 BROWSER_LOGD("SQL error=%d", error);\r
348                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
349                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
350                 _close_db();\r
351                 return EINA_FALSE;\r
352         }\r
353 \r
354         error = sqlite3_step(sqlite3_stmt);\r
355         if (error != SQLITE_ROW) {\r
356                 BROWSER_LOGD("SQL error=%d", error);\r
357                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
358                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
359                 _close_db();\r
360                 return EINA_FALSE;\r
361         }\r
362 \r
363         count = sqlite3_column_int(sqlite3_stmt, 0);\r
364         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK) {\r
365                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
366                 _close_db();\r
367                 return EINA_FALSE;\r
368         }\r
369 \r
370         if (count >= BROWSER_BOOKMARK_COUNT_LIMIT)\r
371                 return EINA_TRUE;\r
372 \r
373         return EINA_FALSE;\r
374 }\r
375 \r
376 Eina_Bool Browser_Bookmark_DB::is_duplicated(int folder_id, const char* title, const char* url)\r
377 {\r
378         if (_open_db() == EINA_FALSE)\r
379                 return EINA_FALSE;\r
380 \r
381         sqlite3_stmt *sqlite3_stmt = NULL;\r
382         int error = sqlite3_prepare_v2(m_db_descriptor, "select id from bookmarks where parent=? and title=?",\r
383                                         -1, &sqlite3_stmt, NULL);\r
384         if (error != SQLITE_OK) {\r
385                 BROWSER_LOGD("SQL error=%d", error);\r
386                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
387                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
388                 _close_db();\r
389                 return EINA_FALSE;\r
390         }\r
391 \r
392         if (sqlite3_bind_int(sqlite3_stmt, 1, folder_id) != SQLITE_OK) {\r
393                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
394                 return EINA_FALSE;\r
395         }\r
396 \r
397         if (sqlite3_bind_text(sqlite3_stmt, 2, title, -1, NULL) != SQLITE_OK) {\r
398                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
399                 return EINA_FALSE;\r
400         }\r
401 \r
402         error = sqlite3_step(sqlite3_stmt);\r
403 \r
404         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
405                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
406 \r
407         if (_close_db() == EINA_FALSE)\r
408                 BROWSER_LOGE("_close_db is failed.");\r
409                 \r
410         if (error == SQLITE_ROW)\r
411                 return EINA_TRUE;\r
412    \r
413         return EINA_FALSE;\r
414 }\r
415 \r
416 Eina_Bool Browser_Bookmark_DB::is_duplicated(const char *folder_name)\r
417 {\r
418         if (_open_db() == EINA_FALSE)\r
419                 return EINA_FALSE;\r
420 \r
421         sqlite3_stmt *sqlite3_stmt = NULL;\r
422         int error = sqlite3_prepare_v2( m_db_descriptor, "select id from bookmarks where type=1 and parent=1 and title=?",\r
423                                         -1, &sqlite3_stmt, NULL);\r
424         if (error != SQLITE_OK) {\r
425                 BROWSER_LOGD("SQL error=%d", error);\r
426                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
427                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
428                 _close_db();\r
429                 return EINA_FALSE;\r
430         }\r
431 \r
432 \r
433         if (sqlite3_bind_text(sqlite3_stmt, 1, folder_name, -1, NULL) != SQLITE_OK)\r
434                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
435 \r
436         error = sqlite3_step(sqlite3_stmt);\r
437 \r
438         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
439                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
440 \r
441         _close_db();\r
442 \r
443         return (error == SQLITE_ROW);\r
444 }\r
445 \r
446 std::string Browser_Bookmark_DB::get_folder_name_by_id(const int folder_id)\r
447 {\r
448         if (_open_db() == EINA_FALSE)\r
449                 return EINA_FALSE;\r
450 \r
451         sqlite3_stmt *sqlite3_stmt = NULL;\r
452         std::string folder_name = "";\r
453 \r
454         int error = sqlite3_prepare_v2(m_db_descriptor, "select title from bookmarks where type=1 and id=?",\r
455                                         -1, &sqlite3_stmt, NULL);\r
456 \r
457         if (error != SQLITE_OK) {\r
458                 BROWSER_LOGD("SQL error=%d", error);\r
459                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
460                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
461                 _close_db();\r
462                 return folder_name;\r
463         }\r
464  \r
465         if (sqlite3_bind_int(sqlite3_stmt, 1, folder_id) != SQLITE_OK) {\r
466                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
467                 return folder_name;\r
468         }\r
469 \r
470         error = sqlite3_step(sqlite3_stmt);\r
471 \r
472         if (error == SQLITE_ROW)\r
473                 folder_name = reinterpret_cast<const char *>(sqlite3_column_text(sqlite3_stmt,0));\r
474    \r
475         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
476                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
477 \r
478         if (_close_db() == EINA_FALSE)\r
479                 BROWSER_LOGE("_close_db is failed.");\r
480 \r
481         return folder_name;\r
482 }\r
483 \r
484 Eina_Bool Browser_Bookmark_DB::get_folder_id(int current_folder_id, const char *folder_name, int *folder_id)\r
485 {\r
486         if (folder_name == NULL || strlen(folder_name) <= 0) {\r
487                 BROWSER_LOGE("folder name is invalid.\n");\r
488         }\r
489 \r
490         if (_open_db() == EINA_FALSE)\r
491                 return EINA_FALSE;\r
492 \r
493         sqlite3_stmt *sqlite3_stmt = NULL;\r
494         int error = sqlite3_prepare_v2(m_db_descriptor, "select id from bookmarks where type=1 and parent=? and title=?",\r
495                                         -1, &sqlite3_stmt, NULL);\r
496         if (error != SQLITE_OK) {\r
497                 BROWSER_LOGD("SQL error=%d", error);\r
498                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
499                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
500                 _close_db();\r
501                 return EINA_FALSE;\r
502         }\r
503 \r
504 \r
505         // binding values\r
506         if (sqlite3_bind_int(sqlite3_stmt, 1, current_folder_id) != SQLITE_OK) {\r
507                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
508                 return EINA_FALSE;\r
509         }\r
510         if (sqlite3_bind_text(sqlite3_stmt, 2, folder_name, -1, NULL) != SQLITE_OK) {\r
511                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
512                 return EINA_FALSE;\r
513         }\r
514 \r
515         // checking if a bookmark exists\r
516         error = sqlite3_step(sqlite3_stmt);\r
517 \r
518         *folder_id = BROWSER_BOOKMARK_MAIN_FOLDER_ID; //just in case\r
519 \r
520         if (error == SQLITE_ROW || error == SQLITE_DONE)\r
521                 *folder_id = sqlite3_column_int(sqlite3_stmt, 0);\r
522 \r
523         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
524                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
525 \r
526         if (_close_db() == EINA_FALSE) {\r
527                 BROWSER_LOGE("_close_db is failed.");\r
528                 return EINA_FALSE;\r
529         }\r
530 \r
531         return (error == SQLITE_DONE || error == SQLITE_ROW);\r
532 }\r
533 \r
534 Eina_Bool Browser_Bookmark_DB::modify_bookmark(int bookmark_id, int folder_id, const char *title, const char *url)\r
535 {\r
536         BROWSER_LOGD("[%s]", __func__);\r
537 \r
538         int last_index = 0;\r
539         Eina_Bool get_last_index_result = EINA_TRUE;\r
540         if (!_get_last_index(folder_id, &last_index)) {\r
541                 BROWSER_LOGE("_get_last_index failed.\n");\r
542                 get_last_index_result = EINA_FALSE;\r
543         }\r
544 \r
545         if (_open_db() == EINA_FALSE)\r
546                 return EINA_FALSE;\r
547 \r
548         sqlite3_stmt *sqlite3_stmt = NULL;\r
549         int error = sqlite3_prepare_v2(m_db_descriptor, "update bookmarks set title=?, address=?, parent=?, updatedate=DATETIME('now'), sequence=? where id=?",\r
550                                         -1, &sqlite3_stmt, NULL);\r
551         if (error != SQLITE_OK) {\r
552                 BROWSER_LOGD("SQL error=%d", error);\r
553                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
554                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
555                 _close_db();\r
556                 return EINA_FALSE;\r
557         }\r
558 \r
559         if (sqlite3_bind_text(sqlite3_stmt, 1, title, -1, NULL) != SQLITE_OK)\r
560                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
561         if (sqlite3_bind_text(sqlite3_stmt, 2, url, -1, NULL) != SQLITE_OK)\r
562                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
563         if (sqlite3_bind_int(sqlite3_stmt, 3, folder_id) != SQLITE_OK)\r
564                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
565 \r
566         if (get_last_index_result) {\r
567                 if (sqlite3_bind_int(sqlite3_stmt, 4, last_index + 1) != SQLITE_OK)\r
568                         BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
569         } else {\r
570                 if (sqlite3_bind_int(sqlite3_stmt, 4, 1) != SQLITE_OK)\r
571                         BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
572         }\r
573 \r
574         if (sqlite3_bind_int(sqlite3_stmt, 5, bookmark_id) != SQLITE_OK)\r
575                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
576 \r
577         error = sqlite3_step(sqlite3_stmt);\r
578 \r
579         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
580                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
581 \r
582         _close_db();\r
583 \r
584         return (error == SQLITE_DONE);\r
585 }\r
586 \r
587 Eina_Bool Browser_Bookmark_DB::modify_bookmark_title(int bookmark_id, const char *title)\r
588 {\r
589         BROWSER_LOGD("[%s]", __func__);\r
590         if (_open_db() == EINA_FALSE)\r
591                 return EINA_FALSE;\r
592 \r
593         sqlite3_stmt *sqlite3_stmt = NULL;\r
594         int error = sqlite3_prepare_v2(m_db_descriptor, "update bookmarks set title=?, updatedate=DATETIME('now') where id=?",\r
595                                 -1, &sqlite3_stmt, NULL);\r
596         if (error != SQLITE_OK) {\r
597                 BROWSER_LOGD("SQL error=%d", error);\r
598                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
599                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
600                 _close_db();\r
601                 return EINA_FALSE;\r
602         }\r
603         if (sqlite3_bind_text(sqlite3_stmt, 1, title, -1, NULL) != SQLITE_OK)\r
604                 BROWSER_LOGE("sqlite3_bind_text is failed.\n");\r
605 \r
606         if (sqlite3_bind_int(sqlite3_stmt, 2, bookmark_id) != SQLITE_OK)\r
607                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
608 \r
609         error = sqlite3_step(sqlite3_stmt);\r
610         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
611                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
612 \r
613         if (_close_db() == EINA_FALSE) {\r
614                 BROWSER_LOGE("_close_db is failed.");\r
615                 return EINA_FALSE;\r
616         }\r
617 \r
618         return (error == SQLITE_DONE);\r
619 }\r
620 \r
621 Eina_Bool Browser_Bookmark_DB::modify_bookmark_order_index(int bookmark_id, int folder_id, int order_index)\r
622 {\r
623         if (_open_db() == EINA_FALSE)\r
624                 return EINA_FALSE;\r
625 \r
626         sqlite3_stmt *sqlite3_stmt = NULL;\r
627         int error = sqlite3_prepare_v2(m_db_descriptor, "update bookmarks set sequence=? where parent=? and id=?",\r
628                                         -1, &sqlite3_stmt, NULL);\r
629         if (error != SQLITE_OK) {\r
630                 BROWSER_LOGD("SQL error=%d", error);\r
631                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
632                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
633                 _close_db();\r
634                 return EINA_FALSE;\r
635         }\r
636 \r
637         if (sqlite3_bind_int(sqlite3_stmt, 1, order_index) != SQLITE_OK)\r
638                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
639 \r
640         if (sqlite3_bind_int(sqlite3_stmt, 2, folder_id) != SQLITE_OK)\r
641                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
642 \r
643         if (sqlite3_bind_int(sqlite3_stmt, 3, bookmark_id) != SQLITE_OK)\r
644                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
645 \r
646         error = sqlite3_step(sqlite3_stmt);\r
647         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
648                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
649 \r
650         _close_db();\r
651 \r
652         return (error == SQLITE_DONE);\r
653 }\r
654 \r
655 Eina_Bool Browser_Bookmark_DB::get_untitled_folder_count(int *count)\r
656 {\r
657         BROWSER_LOGD("[%s]", __func__);\r
658         if (_open_db() == EINA_FALSE)\r
659                 return EINA_FALSE;\r
660 \r
661         sqlite3_stmt *sqlite3_stmt = NULL;\r
662         std::string statement = "select title from bookmarks where type=1 and title like '%Folder_%' order by length(title), title";\r
663         int error = sqlite3_prepare_v2(m_db_descriptor, statement.c_str(), -1, &sqlite3_stmt, NULL);\r
664         if (error != SQLITE_OK) {\r
665                 BROWSER_LOGD("SQL error=%d", error);\r
666                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
667                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
668                 _close_db();\r
669                 return EINA_FALSE;\r
670         }\r
671 \r
672         std::string title;\r
673         std::string title_from_db;\r
674         char buf[32] = {0, };\r
675         for (int i = 1; ; i++) {\r
676                 *count = i;\r
677                 error = sqlite3_step(sqlite3_stmt);\r
678                 if (error == SQLITE_ROW) {\r
679                         snprintf(buf, sizeof(buf)-1, "Folder_%02d", i);\r
680                         title = buf; \r
681                         title_from_db = reinterpret_cast<const char *>(sqlite3_column_text(sqlite3_stmt,0));\r
682                         if (title_from_db != title)\r
683                                 break;\r
684                 } else\r
685                         break;\r
686         }\r
687 \r
688         if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
689                 BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
690 \r
691         _close_db();\r
692 \r
693         return (error == SQLITE_DONE || error == SQLITE_ROW);\r
694 }\r
695 \r
696 Browser_Bookmark_DB::bookmark_item *Browser_Bookmark_DB::get_bookmark_item_by_id(int bookmark_id)\r
697 {\r
698         BROWSER_LOGD("[%s]", __func__);\r
699         if (_open_db() == EINA_FALSE) {\r
700                 BROWSER_LOGE("open failed");\r
701                 return NULL;\r
702         }\r
703         sqlite3_stmt *sqlite3_stmt = NULL;\r
704         int error = sqlite3_prepare_v2(m_db_descriptor, "select type,parent,address,title,sequence,editable from bookmarks where id=?",\r
705                                         -1, &sqlite3_stmt, NULL);\r
706         if (error != SQLITE_OK) {\r
707                 BROWSER_LOGD("SQL error=%d", error);\r
708                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
709                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
710                 _close_db();\r
711                 return NULL;\r
712         }\r
713         if (sqlite3_bind_int(sqlite3_stmt, 1, bookmark_id) != SQLITE_OK) {\r
714                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
715                 return NULL;\r
716         }\r
717 \r
718         bookmark_item *item = NULL;\r
719         if ((error = sqlite3_step(sqlite3_stmt)) == SQLITE_ROW) {\r
720                 item = new(nothrow) bookmark_item;\r
721                 if (!item) {\r
722                         BROWSER_LOGE("bookmark_item new is failed.\n");\r
723                         return NULL;\r
724                 }\r
725 \r
726                 item->id = bookmark_id;\r
727                 if (sqlite3_column_int(sqlite3_stmt, 0) == BOOKMARK_NORMAL)\r
728                         item->is_folder = EINA_FALSE;\r
729                 else\r
730                         item->is_folder = EINA_TRUE;\r
731 \r
732                 if (!item->is_folder) {\r
733                         const char* url = reinterpret_cast<const char *>(sqlite3_column_text(sqlite3_stmt, 2));\r
734                         if (url && strlen(url) > 0)\r
735                                 item->url = url;\r
736                         else\r
737                                 item->url = "";\r
738                 }\r
739 \r
740                 item->parent = sqlite3_column_int(sqlite3_stmt, 1);\r
741 \r
742                 const char* title = reinterpret_cast<const char *>(sqlite3_column_text(sqlite3_stmt, 3));\r
743                 if (title && strlen(title) > 0)\r
744                         item->title = title;\r
745                 else\r
746                         item->title = "";\r
747 \r
748                 item->order_index = sqlite3_column_int(sqlite3_stmt, 4);\r
749                 item->is_editable = EINA_TRUE;//sqlite3_column_int(sqlite3_stmt, 5);\r
750 \r
751                 item->is_delete = EINA_FALSE;\r
752                 item->user_data_1 = NULL;\r
753                 item->user_data_2 = NULL;\r
754                 item->user_data_3 = 0;\r
755         }\r
756 \r
757         error = sqlite3_finalize(sqlite3_stmt);\r
758         if (error != SQLITE_OK)\r
759         {\r
760                 BROWSER_LOGE("sqlite3_finalize is failed. (%d)", error);\r
761                 return NULL;\r
762         }\r
763 \r
764         if (_close_db() == EINA_FALSE) {\r
765                 BROWSER_LOGE("_close_db is failed.");\r
766                 return NULL;\r
767         }\r
768 \r
769         return item;\r
770 }\r
771 \r
772 Eina_Bool Browser_Bookmark_DB::get_bookmark_list(std::vector<bookmark_item *> &list, int folder_id)\r
773 {\r
774         BROWSER_LOGD("[%s]", __func__);\r
775         if (_open_db() == EINA_FALSE) {\r
776                 BROWSER_LOGE("open failed");\r
777                 return EINA_FALSE;\r
778         }\r
779 \r
780         sqlite3_stmt *sqlite3_stmt = NULL;\r
781         int error = sqlite3_prepare_v2(m_db_descriptor, "select id,type,parent,address,title,sequence,editable from bookmarks where parent=? order by sequence",\r
782                                         -1,&sqlite3_stmt,NULL);\r
783         if (error != SQLITE_OK) {\r
784                 BROWSER_LOGD("SQL error=%d", error);\r
785                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
786                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
787                 _close_db();\r
788                 return EINA_FALSE;\r
789         }\r
790         if (sqlite3_bind_int(sqlite3_stmt, 1, folder_id) != SQLITE_OK) {\r
791                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
792                 return EINA_FALSE;\r
793         }\r
794 \r
795         bookmark_item *item;\r
796         while ((error = sqlite3_step(sqlite3_stmt)) == SQLITE_ROW) {\r
797                 item = new(nothrow) bookmark_item;\r
798                 if (!item) {\r
799                         BROWSER_LOGE("bookmark_item new is failed.\n");\r
800                         return EINA_FALSE;\r
801                 }\r
802 \r
803                 item->id = sqlite3_column_int(sqlite3_stmt, 0);\r
804                 if (sqlite3_column_int(sqlite3_stmt, 1) == BOOKMARK_NORMAL)\r
805                         item->is_folder = EINA_FALSE;\r
806                 else\r
807                         item->is_folder = EINA_TRUE;\r
808 \r
809                 if (!item->is_folder) {\r
810                         const char* url = reinterpret_cast<const char *>(sqlite3_column_text(sqlite3_stmt, 3));\r
811                         if (url && strlen(url) > 0)\r
812                                 item->url = url;\r
813                         else\r
814                                 item->url = "";\r
815                 }\r
816 \r
817                 item->parent = sqlite3_column_int(sqlite3_stmt, 2);\r
818 \r
819                 const char* title = reinterpret_cast<const char *>(sqlite3_column_text(sqlite3_stmt, 4));\r
820                 if (title && strlen(title) > 0)\r
821                         item->title = title;\r
822                 else\r
823                         item->title = "";\r
824 \r
825                 item->order_index = sqlite3_column_int(sqlite3_stmt, 5);\r
826                 item->is_editable = EINA_TRUE;//sqlite3_column_int(sqlite3_stmt, 6);\r
827 \r
828                 item->is_delete = EINA_FALSE;\r
829                 item->user_data_1 = NULL;\r
830                 item->user_data_2 = NULL;\r
831                 item->user_data_3 = 0;\r
832                 list.push_back(item);\r
833         }\r
834 \r
835         error = sqlite3_finalize(sqlite3_stmt);\r
836         if (error != SQLITE_OK)\r
837         {\r
838                 BROWSER_LOGE("sqlite3_finalize is failed. (%d)", error);\r
839                 return EINA_FALSE;\r
840         }\r
841 \r
842         if (_close_db() == EINA_FALSE) {\r
843                 BROWSER_LOGE("_close_db is failed.");\r
844                 return EINA_FALSE;\r
845         }\r
846 \r
847         return EINA_TRUE;\r
848 }\r
849 \r
850 Eina_Bool Browser_Bookmark_DB::get_folder_list(std::vector<bookmark_item *> &list)\r
851 {\r
852         if (_open_db() == EINA_FALSE)\r
853                 return EINA_FALSE;\r
854 \r
855         sqlite3_stmt *sqlite3_stmt = NULL;\r
856         int error = sqlite3_prepare_v2(m_db_descriptor, "select id,type,parent,address,title,sequence from bookmarks where type=1 and parent=? order by sequence",\r
857                                         -1, &sqlite3_stmt, NULL);\r
858         if (error != SQLITE_OK) {\r
859                 BROWSER_LOGD("SQL error=%d", error);\r
860                 if (sqlite3_finalize(sqlite3_stmt) != SQLITE_OK)\r
861                         BROWSER_LOGE("sqlite3_finalize is failed.\n");\r
862                 _close_db();\r
863                 return EINA_FALSE;\r
864         }\r
865 \r
866         if (sqlite3_bind_int(sqlite3_stmt, 1, BROWSER_BOOKMARK_MAIN_FOLDER_ID) != SQLITE_OK)\r
867                 BROWSER_LOGE("sqlite3_bind_int is failed.\n");\r
868 \r
869         bookmark_item *item;\r
870         while ((error = sqlite3_step(sqlite3_stmt)) == SQLITE_ROW)\r
871         {\r
872                 item = new(nothrow) bookmark_item;\r
873                 if (!item) {\r
874                         BROWSER_LOGE("bookmark_item new is failed.\n");\r
875                         return EINA_FALSE;\r
876                 }\r
877 \r
878                 item->id = sqlite3_column_int(sqlite3_stmt, 0);\r
879                 item->is_folder = sqlite3_column_int(sqlite3_stmt, 1) == BOOKMARK_NORMAL ? EINA_FALSE : EINA_TRUE;\r
880                 item->parent = sqlite3_column_int(sqlite3_stmt, 2);\r
881                 item->title = "";\r
882 \r
883                 const char* title = reinterpret_cast<const char *>(sqlite3_column_text(sqlite3_stmt, 4));\r
884                 if (title && strlen(title)>0)\r
885                         item->title = title;\r
886                 else\r
887                         item->title = "";\r
888                 item->order_index = sqlite3_column_int(sqlite3_stmt, 5);\r
889                 item->is_editable = EINA_TRUE;\r
890                 item->is_delete = EINA_FALSE;\r
891 \r
892                 list.push_back(item);\r
893         }\r
894 \r
895         error = sqlite3_finalize(sqlite3_stmt);\r
896         if (error != SQLITE_OK)\r
897                 BROWSER_LOGE("sqlite3_finalize is failed. (%d)\n", error);\r
898 \r
899         _close_db();\r
900 \r
901         return (error == SQLITE_DONE || error == SQLITE_OK);\r
902 }\r
903 \r
904 \r