change the db handle to avoid conflict
[framework/api/media-content.git] / src / media_tag.c
1 /*\r
2 * Copyright (c) 2011 Samsung Electronics Co., Ltd All Rights Reserved\r
3 *\r
4 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0\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 #include <media_content.h>\r
19 #include <media_info_private.h>\r
20 #include <audio-svc.h>\r
21 #include <audio-svc-error.h>\r
22 #include <audio-svc-types.h>\r
23 #include <visual-svc-types.h>\r
24 #include <visual-svc.h>\r
25 #include <dlog.h>\r
26 \r
27 #ifdef LOG_TAG\r
28 #undef LOG_TAG\r
29 #endif\r
30 \r
31 #define LOG_TAG "TIZEN_N_MEDIACONTENT"\r
32 \r
33 int media_tag_foreach_tag_from_db(media_tag_filter_h filter, media_tag_cb callback,void* user_data)\r
34 {\r
35         int ret = MEDIA_CONTENT_ERROR_NONE;\r
36         \r
37         char limit_query[MIN_QUERY_SIZE];\r
38         char search_query[DEFAULT_QUERY_SIZE];\r
39         char select_query[DEFAULT_QUERY_SIZE];  \r
40         char order_query[MIN_QUERY_SIZE];\r
41 \r
42         sqlite3_stmt *stmt = NULL;\r
43 \r
44 \r
45         media_tag_filter_s* _filter = NULL;\r
46         \r
47 \r
48         if(callback == NULL )\r
49         {\r
50                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
51                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
52         }\r
53 \r
54 \r
55         memset(limit_query,0x00,sizeof(limit_query));   \r
56         memset(search_query,0x00,sizeof(search_query)); \r
57         memset(select_query,0x00,sizeof(select_query)); \r
58         memset(order_query,0x00,sizeof(order_query));   \r
59         \r
60 \r
61         if(filter != NULL)\r
62                  _filter = (media_tag_filter_s*)filter;\r
63         else\r
64         {\r
65                 media_tag_filter_create((media_tag_filter_h*)&_filter);\r
66         }\r
67 \r
68 \r
69         snprintf(select_query,sizeof(select_query),"%s", SELECT_TAG_LIST);\r
70 \r
71 \r
72         if((_filter->keyword != NULL) && strlen(_filter->keyword) > 0)\r
73         {\r
74                 if(strlen(_filter->keyword) < sizeof(search_query))\r
75                 {\r
76                         snprintf(search_query,sizeof(search_query)," and tag_name like '%%%s%%'", _filter->keyword);\r
77                 }\r
78                 else\r
79                 {\r
80                         LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
81                         if((media_tag_filter_s*)filter != _filter)\r
82                                 media_tag_filter_destroy((media_tag_filter_h)_filter);\r
83                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
84                 }\r
85         }\r
86         else\r
87         {\r
88                 search_query[0] = ' ';\r
89         }\r
90 \r
91         snprintf(limit_query,sizeof(limit_query),"%s %d,%d",QUERY_KEYWORD_LIMIT,_filter->offset,_filter->count);\r
92 \r
93 \r
94         if(_filter->order == MEDIA_CONTENT_SORT_BY_NAME_ASC)\r
95         {\r
96                 snprintf(order_query,sizeof(order_query),"%s %s",QUERY_KEYWORD_ORDER_BY,DB_FIELD_TAG_NAME);\r
97         }\r
98         else if(_filter->order == MEDIA_CONTENT_SORT_BY_NAME_DESC)\r
99         {\r
100                 snprintf(order_query,sizeof(order_query),"%s %s %s",QUERY_KEYWORD_ORDER_BY,DB_FIELD_TAG_NAME,QUERY_KEYWORD_DESC);\r
101         }\r
102         else if(_filter->order == MEDIA_CONTENT_SORT_BY_DATE_ASC)\r
103         {\r
104                 snprintf(order_query,sizeof(order_query),"%s %s",QUERY_KEYWORD_ORDER_BY,DB_FIELD_ID);\r
105         }\r
106         else if(_filter->order == MEDIA_CONTENT_SORT_BY_DATE_DESC)\r
107         {\r
108                 snprintf(order_query,sizeof(order_query),"%s %s %s",QUERY_KEYWORD_ORDER_BY,DB_FIELD_ID,QUERY_KEYWORD_DESC);             \r
109         }\r
110 \r
111 \r
112         if((media_tag_filter_s*)filter != _filter)\r
113                 media_tag_filter_destroy((media_tag_filter_h)_filter);\r
114                         \r
115         if(select_query != NULL)\r
116         {\r
117                 ret = _content_query_prepare(&stmt,select_query,NULL,search_query,limit_query,order_query);\r
118                 if(ret != MEDIA_CONTENT_ERROR_NONE)\r
119                         return ret;\r
120         }\r
121 \r
122 \r
123         while( sqlite3_step(stmt) == SQLITE_ROW)\r
124         {\r
125                 media_tag_s* _tag = (media_tag_s*)calloc(1,sizeof(media_tag_s));\r
126 \r
127                 if(_tag == NULL)\r
128                 {\r
129                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
130                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
131                 }\r
132                 \r
133                 memset(_tag,0x00,sizeof(media_tag_s));\r
134                 _tag->tag_id = (int)sqlite3_column_int(stmt,0);\r
135                 _tag->name= strdup((const char *)sqlite3_column_text(stmt, 1));\r
136                 if(callback((media_tag_h)_tag,user_data) == false)\r
137                 {\r
138                         media_tag_destroy((media_tag_h)_tag);\r
139                         break;\r
140                 }\r
141                 media_tag_destroy((media_tag_h)_tag);\r
142                 \r
143         }\r
144         if(stmt != NULL)\r
145         {\r
146                 sqlite3_finalize(stmt);\r
147         }\r
148         \r
149         return ret;\r
150 }\r
151 \r
152 \r
153 \r
154 int media_tag_insert_to_db(const char* tag_name,media_tag_h* tag)\r
155 {\r
156         \r
157         int ret = MEDIA_CONTENT_ERROR_NONE;\r
158 \r
159                 \r
160         if(tag_name == NULL ||  strlen(tag_name) == 0)\r
161         {\r
162                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
163                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
164         }\r
165 \r
166         media_tag_s *_tag = (media_tag_s*)calloc(1,sizeof(media_tag_s));\r
167 \r
168         _tag->name = strdup(tag_name);\r
169 \r
170         if(_tag->name == NULL)\r
171         {\r
172                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
173                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
174         }\r
175 \r
176         ret = minfo_add_tag(_content_get_db_handle(),NULL,tag_name);\r
177 \r
178         if(ret == MB_SVC_ERROR_NONE)\r
179         {\r
180                 *tag = (media_tag_h)_tag;\r
181         }\r
182 \r
183         return _content_error_capi(MEDIA_CONTENT_TYPE,ret);\r
184 \r
185 }\r
186 \r
187 int media_tag_delete_from_db(media_tag_h tag)\r
188 {\r
189         int ret = MEDIA_CONTENT_ERROR_NONE;\r
190 \r
191         if(tag == NULL)\r
192         {\r
193                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
194 \r
195                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
196         }\r
197 \r
198         \r
199         media_tag_s* _tag = (media_tag_s*)tag;\r
200         \r
201         \r
202         ret = minfo_delete_tag(_content_get_db_handle(), NULL, _tag->name);\r
203         \r
204         return _content_error_capi(MEDIA_CONTENT_TYPE,ret);\r
205 \r
206 }\r
207 \r
208 int media_tag_add_media_to_db(media_tag_h tag,media_info_h media)\r
209 {\r
210         int ret = MEDIA_CONTENT_ERROR_NONE;\r
211 \r
212 \r
213         media_tag_s* _tag = (media_tag_s*)tag;\r
214         media_info_s* _item = (media_info_s*)media;\r
215         \r
216         if(_tag == NULL || _item == NULL )\r
217         {\r
218                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
219                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
220         }\r
221 \r
222         if(_item->media_type == MEDIA_CONTENT_TYPE_AUDIO)\r
223         {\r
224                 LOGE("[%s]_NOT_SUPPORTED_AUDIO(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_NOT_SUPPORTED_AUDIO);\r
225 \r
226                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED_AUDIO;\r
227         }\r
228         \r
229         if(_tag->name == NULL || strlen(_tag->name) == 0)\r
230         {\r
231                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
232 \r
233                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;   \r
234         }\r
235         \r
236         ret = minfo_add_tag(_content_get_db_handle(), _item->item_id,_tag->name);\r
237 \r
238         return _content_error_capi(MEDIA_CONTENT_TYPE,ret);\r
239 \r
240 }\r
241 \r
242 int media_tag_remove_media_from_db(media_tag_h tag,media_info_h media)\r
243 {\r
244         int ret = MEDIA_CONTENT_ERROR_NONE;\r
245 \r
246         char *query_string = NULL;\r
247         \r
248         media_tag_s* _tag = (media_tag_s*)tag;\r
249         media_info_s* _item = (media_info_s*)media;     \r
250         if(_tag == NULL || _item == NULL )\r
251         {\r
252                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
253                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
254         }\r
255         if(_item->media_type == MEDIA_CONTENT_TYPE_AUDIO)\r
256         {\r
257                 LOGE("[%s]_NOT_SUPPORTED_AUDIO(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_NOT_SUPPORTED_AUDIO);\r
258                 return MEDIA_CONTENT_ERROR_NOT_SUPPORTED_AUDIO;\r
259         }\r
260 \r
261 \r
262         if(_tag->name == NULL || strlen(_tag->name) == 0)\r
263         {\r
264                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
265                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
266         }\r
267 \r
268         query_string = sqlite3_mprintf("DELETE FROM visual_tag_map WHERE visual_uuid=%s and tag_name=%d",\r
269                               _item->item_id, _tag->name);\r
270 \r
271         \r
272         _content_query_sql(query_string);\r
273 \r
274         sqlite3_free(query_string);\r
275 \r
276         return _content_error_capi(MEDIA_CONTENT_TYPE,ret);     \r
277 \r
278 }\r
279 \r
280 \r
281 int media_tag_destroy(media_tag_h tag)\r
282 {\r
283         int ret;\r
284         media_tag_s* _tag = (media_tag_s*)tag;  \r
285         if(_tag) \r
286         {\r
287                 if(_tag->name) \r
288                 {\r
289                         free(_tag->name);\r
290                 }                       \r
291 \r
292                 free(_tag);\r
293                 ret = MEDIA_CONTENT_ERROR_NONE;\r
294         }\r
295         else \r
296         {\r
297                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
298                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
299         }\r
300         return ret;\r
301 \r
302 }\r
303 int media_tag_clone(media_tag_h* dst, media_tag_h src)\r
304 {\r
305         int ret;\r
306         media_tag_s* _src = (media_tag_s*)src;  \r
307         media_tag_s* _dst = NULL;\r
308 \r
309 \r
310         if((_src != NULL))\r
311         {\r
312                 _dst = (media_tag_s*)calloc(1,sizeof(media_tag_s));            \r
313                 \r
314                 if(_dst == NULL)\r
315                 {\r
316                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
317                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
318                 }\r
319         \r
320                 _dst->tag_id = _src->tag_id;\r
321                                 \r
322                 if((_src->name != NULL) && (strlen(_src->name) > 0))\r
323                 {\r
324                         _dst->name = strdup(_src->name);\r
325                         if(_dst->name == NULL)\r
326                         {\r
327                                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
328                                 free(_dst);\r
329                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
330                         }\r
331                 }\r
332                 *dst = (media_tag_h)_dst;\r
333                 ret = MEDIA_CONTENT_ERROR_NONE;         \r
334         }\r
335         else \r
336         {\r
337                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
338                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
339         }       \r
340                 \r
341         return ret;     \r
342 }\r
343 \r
344 int media_tag_get_name(media_tag_h tag, char** name)\r
345 {\r
346         int ret;\r
347         media_tag_s* _tag = (media_tag_s*)tag;  \r
348         if(_tag) \r
349         {\r
350                 if((_tag->name != NULL) && (strlen(_tag->name) > 0))\r
351                 {\r
352                         *name = strdup(_tag->name);\r
353                         if(*name == NULL)\r
354                         {\r
355                                 LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
356                                 return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
357                         }\r
358                 }\r
359                 else\r
360                 {\r
361                         *name = NULL;\r
362                 }\r
363                 ret = MEDIA_CONTENT_ERROR_NONE;                                 \r
364 \r
365         }\r
366         else \r
367         {\r
368                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
369                 ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
370         }       \r
371 \r
372         return ret;\r
373 \r
374 }\r
375 int media_tag_update_name_to_db(media_tag_h tag, const char* name)\r
376 {\r
377         int ret = MEDIA_CONTENT_ERROR_NONE;\r
378 \r
379         media_tag_s* _tag = (media_tag_s*)tag;\r
380         if(_tag == NULL || name == NULL || strlen(name) <= 0)\r
381         {\r
382                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
383                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
384         }\r
385 \r
386         ret = minfo_rename_tag(_content_get_db_handle(),_tag->name,name);\r
387 \r
388         if(ret == MB_SVC_ERROR_NONE)\r
389         {\r
390                 free(_tag->name);\r
391                 _tag->name = strdup(name);\r
392                 if(_tag->name == NULL)\r
393                 {\r
394                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
395                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;\r
396                 }\r
397         }\r
398                 \r
399         return _content_error_capi(MEDIA_CONTENT_TYPE,ret);\r
400 }\r
401 \r
402 int media_tag_foreach_media_from_db(media_tag_h tag,media_info_filter_h filter, media_info_cb callback,void* user_data)\r
403 {\r
404         int ret = MEDIA_CONTENT_ERROR_NONE;\r
405         char* media_id = NULL;\r
406         Mitem *mitem = NULL;\r
407         char select_query[DEFAULT_QUERY_SIZE];  \r
408         char search_query[MAX_KEYWORD_SIZE];\r
409         char limit_query[MIN_QUERY_SIZE];\r
410         char order_query[MIN_QUERY_SIZE];\r
411 \r
412         media_tag_filter_s* _filter = NULL;\r
413         \r
414         sqlite3_stmt *stmt = NULL;\r
415 \r
416         memset(select_query,0x00,sizeof(select_query)); \r
417         memset(search_query,0x00,sizeof(search_query)); \r
418         memset(limit_query,0x00,sizeof(limit_query)); \r
419         memset(order_query,0x00,sizeof(order_query)); \r
420 \r
421         media_tag_s* _tag = (media_tag_s*)tag;  \r
422         \r
423         if(_tag == NULL || callback == NULL)\r
424         {\r
425                 LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
426                 return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
427         }\r
428         \r
429         if(filter != NULL)\r
430                  _filter = (media_tag_filter_s*)filter;\r
431         else\r
432         {\r
433                 media_tag_filter_create((media_tag_filter_h*)&_filter);\r
434         }\r
435 \r
436         \r
437         snprintf(select_query,sizeof(select_query),SELECT_MEDIA_FROM_TAG,_tag->name);\r
438 \r
439 \r
440         if((_filter->keyword != NULL) && strlen(_filter->keyword) > 0)\r
441         {\r
442                 if(strlen(_filter->keyword) < sizeof(search_query))\r
443                 {\r
444                         snprintf(search_query,sizeof(search_query)," and display_name like '%%%s%%'", _filter->keyword);\r
445                 }\r
446                 else\r
447                 {\r
448                         LOGE("[%s]INVALID_PARAMETER(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_INVALID_PARAMETER);\r
449                         if((media_tag_filter_s*)filter != _filter)\r
450                                 media_tag_filter_destroy((media_tag_filter_h)_filter);          \r
451                         return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;\r
452                 }\r
453         }\r
454         else\r
455         {\r
456                 search_query[0] = ' ';\r
457         }\r
458 \r
459 \r
460         snprintf(limit_query,sizeof(limit_query),"%s %d,%d",QUERY_KEYWORD_LIMIT,_filter->offset,_filter->count);\r
461 \r
462         \r
463 \r
464         if(_filter->order == MEDIA_CONTENT_SORT_BY_NAME_ASC)\r
465         {\r
466                 snprintf(order_query,sizeof(order_query),"%s %s",QUERY_KEYWORD_ORDER_BY,DB_FILED_DISPLAY_NAME);\r
467         }\r
468         else if(_filter->order == MEDIA_CONTENT_SORT_BY_NAME_DESC)\r
469         {\r
470                 snprintf(order_query,sizeof(order_query),"%s %s %s",QUERY_KEYWORD_ORDER_BY,DB_FILED_DISPLAY_NAME,QUERY_KEYWORD_DESC);\r
471         }\r
472         else if(_filter->order == MEDIA_CONTENT_SORT_BY_DATE_ASC)\r
473         {\r
474                 snprintf(order_query,sizeof(order_query),"%s %s",QUERY_KEYWORD_ORDER_BY,DB_FILED_MODIFIED_DATE);\r
475         }\r
476         else if(_filter->order == MEDIA_CONTENT_SORT_BY_DATE_DESC)\r
477         {\r
478                 snprintf(order_query,sizeof(order_query),"%s %s %s",QUERY_KEYWORD_ORDER_BY,DB_FILED_MODIFIED_DATE,QUERY_KEYWORD_DESC);          \r
479         }\r
480 \r
481 \r
482         if((media_tag_filter_s*)filter != _filter)\r
483                 media_tag_filter_destroy((media_tag_filter_h)_filter);\r
484 \r
485         ret = _content_query_prepare(&stmt,select_query,NULL,search_query,limit_query,order_query);\r
486         if(ret != MEDIA_CONTENT_ERROR_NONE)\r
487                 return ret;\r
488 \r
489 \r
490         while( sqlite3_step(stmt) == SQLITE_ROW)\r
491         {\r
492                 media_info_s* _item = (media_info_s*)calloc(1,sizeof(media_info_s));\r
493 \r
494                 if(_item == NULL)\r
495                 {\r
496                         LOGE("[%s]OUT_OF_MEMORY(0x%08x)", __FUNCTION__, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);\r
497                         return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;       \r
498                 }\r
499                 memset(_item,0x00,sizeof(media_info_s));\r
500                 media_id = (char*)sqlite3_column_text(stmt, 1);\r
501                 ret = minfo_get_item_by_id(_content_get_db_handle(),media_id, &mitem);\r
502 \r
503                 if(ret < 0)\r
504                 {\r
505                         if(stmt != NULL)\r
506                         {\r
507                                 sqlite3_finalize(stmt);\r
508                         }\r
509                         media_info_destroy((media_info_h)_item);\r
510                         return _content_error_capi(MEDIA_CONTENT_TYPE,ret);\r
511                 }\r
512                 _item->item_id = strdup(media_id);\r
513                 _item->file_path = strdup(mitem->file_url);\r
514                 _item->display_name = strdup(mitem->display_name);\r
515                 _item->thumbnail = strdup(mitem->thumb_url);\r
516                 _item->date_modified = mitem->mtime;\r
517                 _item->media_type = mitem->type;        \r
518                 if(callback((media_info_h)_item,user_data) == false)\r
519                 {\r
520                         media_info_destroy((media_info_h)_item);\r
521                         break;\r
522                 }\r
523                 media_info_destroy((media_info_h)_item);\r
524         }\r
525                 \r
526         if(mitem != NULL)\r
527                 minfo_destroy_mtype_item(mitem);\r
528         if(stmt != NULL)\r
529         {\r
530                 sqlite3_finalize(stmt);\r
531         }\r
532 \r
533         return ret;\r
534 }\r
535 \r