Match columns of storage with filter keyword
[platform/core/api/media-content.git] / src / media_tag.c
index ba654d4..884eccc 100755 (executable)
 
 #include <media_info_private.h>
 
-
-static __thread GList *g_tag_item_list = NULL;
-
-static void __media_tag_item_add(media_tag_item_s *item_s);
-static void __media_tag_item_release(void);
+static void __media_tag_item_add(media_tag_s *tag_s, media_tag_item_s *item_s);
+static void __media_tag_item_release(media_tag_s *tag_s);
 static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id);
 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id);
 static int __media_tag_update_tag_name(int tag_id, const char *tag_name);
 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag);
 
-static void __media_tag_item_add(media_tag_item_s *item_s)
+static void __media_tag_item_add(media_tag_s *tag_s, media_tag_item_s *item_s)
 {
-       g_tag_item_list = g_list_append(g_tag_item_list, item_s);
+       tag_s->item_list = g_list_append(tag_s->item_list, item_s);
 }
 
-static void __media_tag_item_release(void)
+static void __media_tag_item_release(media_tag_s *tag_s)
 {
        int idx = 0;
        int list_cnt = 0;
        media_tag_item_s *item = NULL;
 
-       list_cnt = g_list_length(g_tag_item_list);
+       list_cnt = g_list_length(tag_s->item_list);
 
        media_content_debug("list_cnt : [%d]", list_cnt);
 
-       for(idx = 0; idx < list_cnt; idx++)
-       {
-               item = (media_tag_item_s*)g_list_nth_data(g_tag_item_list, idx);
-               if(item != NULL)
-               {
+       for (idx = 0; idx < list_cnt; idx++) {
+               item = (media_tag_item_s*)g_list_nth_data(tag_s->item_list, idx);
+               if (item != NULL) {
                        SAFE_FREE(item->media_id);
                        SAFE_FREE(item->tag_name);
                        SAFE_FREE(item);
                }
        }
 
-       g_list_free(g_tag_item_list);
-       g_tag_item_list = NULL;
+       g_list_free(tag_s->item_list);
+       tag_s->item_list = NULL;
 
 }
 
@@ -63,12 +58,10 @@ static int __media_tag_insert_item_to_tag(int tag_id, const char *media_id)
        int ret = MEDIA_CONTENT_ERROR_NONE;
        char *query_str = NULL;
 
-       query_str = sqlite3_mprintf("INSERT INTO %q (tag_id, media_uuid) values (%d, '%q')",
-                       DB_TABLE_TAG_MAP, tag_id, media_id);
-       ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       query_str = sqlite3_mprintf("INSERT INTO %q (tag_id, media_uuid) values (%d, '%q');", DB_TABLE_TAG_MAP, tag_id, media_id);
+       ret = media_svc_append_query(query_str, _content_get_uid());
 
-       return ret;
+       return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
 }
 
 static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id)
@@ -77,11 +70,9 @@ static int __media_tag_remove_item_from_tag(int tag_id, const char *media_id)
        char *query_str = NULL;
 
        query_str = sqlite3_mprintf(REMOVE_TAG_ITEM_FROM_TAG_MAP, tag_id, media_id);
+       ret = media_svc_append_query(query_str, _content_get_uid());
 
-       ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
-
-       return ret;
+       return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
 }
 
 static int __media_tag_update_tag_name(int tag_id, const char *tag_name)
@@ -90,11 +81,9 @@ static int __media_tag_update_tag_name(int tag_id, const char *tag_name)
        char *query_str = NULL;
 
        query_str = sqlite3_mprintf(UPDATE_TAG_NAME_FROM_TAG, tag_name, tag_id);
+       ret = media_svc_append_query(query_str, _content_get_uid());
 
-       ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
-
-       return ret;
+       return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
 }
 
 static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
@@ -102,8 +91,6 @@ static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
        int ret = MEDIA_CONTENT_ERROR_NONE;
        sqlite3_stmt *stmt = NULL;
        char *select_query = NULL;
-       int id = 0;
-       char *tag_name = NULL;
        media_tag_s *_tag = (media_tag_s*)tag;
 
        media_content_retvm_if(_tag == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid tag");
@@ -111,25 +98,17 @@ static int __media_tag_get_tag_info_from_db(const char *name, media_tag_h tag)
        select_query = sqlite3_mprintf(SELECT_TAG_BY_NAME, name);
 
        ret = _content_query_prepare(&stmt, select_query, NULL, NULL);
-       sqlite3_free(select_query);
+       SQLITE3_SAFE_FREE(select_query);
        media_content_retv_if(ret != MEDIA_CONTENT_ERROR_NONE, ret);
 
-       while(sqlite3_step(stmt) == SQLITE_ROW)
-       {
-               id = (int)sqlite3_column_int(stmt,0);
-
-               if(STRING_VALID((const char *)sqlite3_column_text(stmt, 1)))
-               {
-                       if(tag_name)
-                               SAFE_FREE(tag_name);
-
-                       tag_name = strdup((const char *)sqlite3_column_text(stmt, 1));
-               }
+       if (sqlite3_step(stmt) == SQLITE_ROW) {
+               _tag->tag_id = (int)sqlite3_column_int(stmt, 0);
+               _tag->name = g_strdup(name);
+       } else {
+               media_content_error("Nonexistent tag name[%s]", name);
+               ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
-       _tag->tag_id = id;
-       _tag->name = tag_name;
-
        SQLITE3_FINALIZE(stmt);
 
        return ret;
@@ -140,18 +119,16 @@ int media_tag_insert_to_db(const char *tag_name, media_tag_h *tag)
        int ret = MEDIA_CONTENT_ERROR_NONE;
        char *query_str = NULL;
 
-       if(!STRING_VALID(tag_name))
-       {
+       if (!STRING_VALID(tag_name)) {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
        query_str = sqlite3_mprintf(INSERT_TAG_TO_TAG, tag_name);
        ret = _content_query_sql(query_str);
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
-       if(ret == MEDIA_CONTENT_ERROR_NONE)
-       {
+       if (ret == MEDIA_CONTENT_ERROR_NONE) {
                media_tag_s *_tag = (media_tag_s*)calloc(1, sizeof(media_tag_s));
                media_content_retvm_if(_tag == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
 
@@ -167,8 +144,7 @@ int media_tag_delete_from_db(int tag_id)
        int ret = MEDIA_CONTENT_ERROR_NONE;
        char *query_str = NULL;
 
-       if(tag_id < 0)
-       {
+       if (tag_id < 0) {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -177,7 +153,7 @@ int media_tag_delete_from_db(int tag_id)
 
        ret = _content_query_sql(query_str);
 
-       sqlite3_free(query_str);
+       SQLITE3_SAFE_FREE(query_str);
 
        return ret;
 }
@@ -186,12 +162,9 @@ int media_tag_get_tag_count_from_db(filter_h filter, int *tag_count)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
 
-       if(tag_count != NULL)
-       {
+       if (tag_count != NULL) {
                ret = _media_db_get_group_count(filter, MEDIA_GROUP_TAG, tag_count);
-       }
-       else
-       {
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -199,12 +172,11 @@ int media_tag_get_tag_count_from_db(filter_h filter, int *tag_count)
        return ret;
 }
 
-int media_tag_foreach_tag_from_db (filter_h filter, media_tag_cb callback, void *user_data)
+int media_tag_foreach_tag_from_db(filter_h filter, media_tag_cb callback, void *user_data)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
 
-       if(callback == NULL)
-       {
+       if (callback == NULL) {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -218,12 +190,9 @@ int media_tag_get_media_count_from_db(int tag_id, filter_h filter, int *media_co
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
 
-       if((tag_id > 0) && (media_count != NULL))
-       {
+       if ((tag_id > 0) && (media_count != NULL)) {
                ret = _media_db_get_group_item_count_by_id(tag_id, filter, MEDIA_GROUP_TAG, media_count);
-       }
-       else
-       {
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -235,8 +204,7 @@ int media_tag_foreach_media_from_db(int tag_id, filter_h filter, media_info_cb c
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
 
-       if(callback == NULL)
-       {
+       if (callback == NULL) {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -250,38 +218,33 @@ int media_tag_destroy(media_tag_h tag)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
        media_tag_s *_tag = (media_tag_s*)tag;
-       if(_tag)
-       {
+       if (_tag) {
                SAFE_FREE(_tag->name);
                SAFE_FREE(_tag);
                ret = MEDIA_CONTENT_ERROR_NONE;
-       }
-       else
-       {
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
        return ret;
 }
+
 int media_tag_clone(media_tag_h *dst, media_tag_h src)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
        media_tag_s *_src = (media_tag_s*)src;
        media_tag_s *_dst = NULL;
 
-       if((_src != NULL))
-       {
+       if ((_src != NULL)) {
                _dst = (media_tag_s*)calloc(1, sizeof(media_tag_s));
                media_content_retvm_if(_dst == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
 
                _dst->tag_id = _src->tag_id;
 
-               if(STRING_VALID(_src->name))
-               {
+               if (STRING_VALID(_src->name)) {
                        _dst->name = strdup(_src->name);
-                       if(_dst->name == NULL)
-                       {
+                       if (_dst->name == NULL) {
                                SAFE_FREE(_dst);
                                media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
                                return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
@@ -289,9 +252,7 @@ int media_tag_clone(media_tag_h *dst, media_tag_h src)
                }
                *dst = (media_tag_h)_dst;
                ret = MEDIA_CONTENT_ERROR_NONE;
-       }
-       else
-       {
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -304,13 +265,10 @@ int media_tag_get_tag_id(media_tag_h tag, int *tag_id)
        int ret = MEDIA_CONTENT_ERROR_NONE;
        media_tag_s *_tag = (media_tag_s*)tag;
 
-       if((_tag != NULL) && (tag_id != NULL))
-       {
+       if ((_tag != NULL) && (tag_id != NULL)) {
                *tag_id = _tag->tag_id;
                ret = MEDIA_CONTENT_ERROR_NONE;
-       }
-       else
-       {
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -322,22 +280,16 @@ int media_tag_get_name(media_tag_h tag, char **name)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
        media_tag_s *_tag = (media_tag_s*)tag;
-       if(_tag)
-       {
-               if(STRING_VALID(_tag->name))
-               {
+       if (_tag) {
+               if (STRING_VALID(_tag->name)) {
                        *name = strdup(_tag->name);
                        media_content_retvm_if(*name == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
-               }
-               else
-               {
+               } else {
                        *name = NULL;
                }
                ret = MEDIA_CONTENT_ERROR_NONE;
 
-       }
-       else
-       {
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -349,10 +301,9 @@ int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
        sqlite3_stmt *stmt = NULL;
-       char select_query[DEFAULT_QUERY_SIZE];
+       char select_query[DEFAULT_QUERY_SIZE] = {0, };
 
-       if(tag_id <= 0)
-       {
+       if (tag_id <= 0) {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -366,27 +317,21 @@ int media_tag_get_tag_from_db(int tag_id, media_tag_h *tag)
 
        media_tag_s *_tag = NULL;
 
-       while(sqlite3_step(stmt) == SQLITE_ROW)
-       {
-               if(_tag)
-                       media_tag_destroy((media_tag_h)_tag);
-
+       if (sqlite3_step(stmt) == SQLITE_ROW) {
                _tag = (media_tag_s*)calloc(1, sizeof(media_tag_s));
-               if(_tag == NULL)
-               {
+               if (_tag == NULL) {
                        SQLITE3_FINALIZE(stmt);
                        media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               _tag->tag_id = (int)sqlite3_column_int(stmt, 0);
-
-               if(STRING_VALID((const char *)sqlite3_column_text(stmt, 1)))
-               {
-                       _tag->name = strdup((const char *)sqlite3_column_text(stmt, 1));
-               }
+               _tag->tag_id = tag_id;
+               _tag->name = g_strdup((const char *)sqlite3_column_text(stmt, 0));
 
                *tag = (media_tag_h)_tag;
+       } else {
+               media_content_error("Nonexistent tag id[%d]", tag_id);
+               ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
        SQLITE3_FINALIZE(stmt);
@@ -399,25 +344,21 @@ int media_tag_add_media(media_tag_h tag, const char *media_id)
        int ret = MEDIA_CONTENT_ERROR_NONE;
        media_tag_s *_tag = (media_tag_s*)tag;
 
-       if((_tag != NULL) && STRING_VALID(media_id))
-       {
+       if ((_tag != NULL) && STRING_VALID(media_id)) {
                media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
                media_content_retvm_if(_item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
 
                _item->media_id = strdup(media_id);
                _item->function = MEDIA_TAG_ADD;
 
-               if(_item->media_id == NULL)
-               {
+               if (_item->media_id == NULL) {
                        SAFE_FREE(_item);
                        media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_tag_item_add(_item);
-       }
-       else
-       {
+               __media_tag_item_add(_tag, _item);
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -430,25 +371,21 @@ int media_tag_remove_media(media_tag_h tag, const char *media_id)
        int ret = MEDIA_CONTENT_ERROR_NONE;
        media_tag_s *_tag = (media_tag_s*)tag;
 
-       if(_tag != NULL && STRING_VALID(media_id))
-       {
+       if (_tag != NULL && STRING_VALID(media_id)) {
                media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
                media_content_retvm_if(_item == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
 
                _item->media_id = strdup(media_id);
                _item->function = MEDIA_TAG_REMOVE;
 
-               if(_item->media_id == NULL)
-               {
+               if (_item->media_id == NULL) {
                        SAFE_FREE(_item);
                        media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_tag_item_add(_item);
-       }
-       else
-       {
+               __media_tag_item_add(_tag, _item);
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -456,13 +393,12 @@ int media_tag_remove_media(media_tag_h tag, const char *media_id)
        return ret;
 }
 
-int media_tag_set_name(media_tag_h tag, char *tag_name)
+int media_tag_set_name(media_tag_h tag, const char *tag_name)
 {
        int ret = MEDIA_CONTENT_ERROR_NONE;
        media_tag_s *_tag = (media_tag_s*)tag;
 
-       if(_tag != NULL && STRING_VALID(tag_name))
-       {
+       if (_tag != NULL && STRING_VALID(tag_name)) {
                SAFE_FREE(_tag->name);
 
                media_tag_item_s *_item = (media_tag_item_s*)calloc(1, sizeof(media_tag_item_s));
@@ -471,26 +407,22 @@ int media_tag_set_name(media_tag_h tag, char *tag_name)
                _item->tag_name = strdup(tag_name);
                _item->function = MEDIA_TAG_UPDATE_TAG_NAME;
 
-               if(_item->tag_name == NULL)
-               {
+               if (_item->tag_name == NULL) {
                        SAFE_FREE(_item);
                        media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
                _tag->name = strdup(tag_name);
-               if(_tag->name == NULL)
-               {
+               if (_tag->name == NULL) {
                        SAFE_FREE(_item->tag_name);
                        SAFE_FREE(_item);
                        media_content_error("OUT_OF_MEMORY(0x%08x)", MEDIA_CONTENT_ERROR_OUT_OF_MEMORY);
                        return MEDIA_CONTENT_ERROR_OUT_OF_MEMORY;
                }
 
-               __media_tag_item_add(_item);
-       }
-       else
-       {
+               __media_tag_item_add(_tag, _item);
+       } else {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                ret = MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
@@ -506,43 +438,116 @@ int media_tag_update_to_db(media_tag_h tag)
        int length = 0;
        media_tag_item_s *_tag_item = NULL;
 
-       if(_tag == NULL)
-       {
+       if (_tag == NULL) {
                media_content_error("INVALID_PARAMETER(0x%08x)", MEDIA_CONTENT_ERROR_INVALID_PARAMETER);
                return MEDIA_CONTENT_ERROR_INVALID_PARAMETER;
        }
 
-       length = g_list_length(g_tag_item_list);
+       if (_tag->item_list != NULL) {
+               length = g_list_length(_tag->item_list);
+       } else {
+               media_content_debug("operation list length is 0");
+               return MEDIA_CONTENT_ERROR_NONE;
+       }
 
        for (idx = 0; idx < length; idx++) {
-               _tag_item = (media_tag_item_s*)g_list_nth_data(g_tag_item_list, idx);
-               if(_tag_item != NULL) {
-                       switch(_tag_item->function) {
-                               case MEDIA_TAG_ADD:
-                               {
-                                       ret = __media_tag_insert_item_to_tag(_tag->tag_id, _tag_item->media_id);
-                               }
-                               break;
-
-                               case MEDIA_TAG_REMOVE:
-                               {
-                                       ret = __media_tag_remove_item_from_tag(_tag->tag_id, _tag_item->media_id);
-                               }
-                               break;
-
-                               case MEDIA_TAG_UPDATE_TAG_NAME:
-                               {
-                                       ret = __media_tag_update_tag_name(_tag->tag_id, _tag_item->tag_name);
-                               }
-                               break;
-
-                               default:
-                               break;
+               _tag_item = (media_tag_item_s*)g_list_nth_data(_tag->item_list, idx);
+               if (_tag_item != NULL) {
+                       switch (_tag_item->function) {
+                       case MEDIA_TAG_ADD:
+                       {
+                               ret = __media_tag_insert_item_to_tag(_tag->tag_id, _tag_item->media_id);
+                       }
+                       break;
+
+                       case MEDIA_TAG_REMOVE:
+                       {
+                               ret = __media_tag_remove_item_from_tag(_tag->tag_id, _tag_item->media_id);
+                       }
+                       break;
+
+                       case MEDIA_TAG_UPDATE_TAG_NAME:
+                       {
+                               ret = __media_tag_update_tag_name(_tag->tag_id, _tag_item->tag_name);
                        }
+                       break;
+
+                       default:
+                       break;
+                       }
+
+                       if (ret != MEDIA_CONTENT_ERROR_NONE)
+                               media_content_error("Failed some operation[%d]", _tag_item->function);
                }
        }
 
-       __media_tag_item_release();
+       ret = media_svc_send_query(_content_get_uid());
+
+       __media_tag_item_release(_tag);
+
+       return _content_error_capi(MEDIA_CONTENT_TYPE, ret);
+}
+
+int media_tag_create(media_tag_h *tag)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+
+       media_content_retvm_if(tag == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid tag");
+
+       media_tag_s *_tag = (media_tag_s*)calloc(1, sizeof(media_tag_s));
+       media_content_retvm_if(_tag == NULL, MEDIA_CONTENT_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY");
+
+       _tag->tag_id = -1;
+       _tag->name = NULL;
+       _tag->item_list = NULL;
+
+       *tag = (media_tag_h)_tag;
 
        return ret;
 }
+
+int media_tag_insert_to_db_v2(media_tag_h tag)
+{
+       int ret = MEDIA_CONTENT_ERROR_NONE;
+       media_tag_s *_tag = (media_tag_s*)tag;
+       media_tag_h tag_1;
+       int tag_id = -1;
+
+       media_content_retvm_if(_tag == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid tag");
+       media_content_retvm_if(!STRING_VALID(_tag->name), MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid tag name");
+       media_content_retvm_if(_tag->tag_id != -1, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid tag insert");
+
+       ret = media_tag_insert_to_db(_tag->name, &tag_1);
+       if (ret != MEDIA_CONTENT_ERROR_NONE) {
+               media_content_error("fail media_tag_insert_to_db");
+               goto ERROR;
+       }
+
+       ret = media_tag_get_tag_id(tag_1, &tag_id);
+       if (ret != MEDIA_CONTENT_ERROR_NONE) {
+               media_content_error("fail media_tag_get_tag_id");
+               goto ERROR;
+       }
+
+        _tag->tag_id = tag_id;
+
+       ret = media_tag_update_to_db(tag);
+
+ERROR:
+       __media_tag_item_release(_tag);
+       media_tag_destroy(tag_1);
+
+       return ret;
+}
+
+int media_tag_update_to_db_v2(int tag_id, media_tag_h tag)
+{
+       media_tag_s *_tag = (media_tag_s*)tag;
+
+       media_content_retvm_if(_tag == NULL, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid tag");
+       media_content_retvm_if(tag_id == -1, MEDIA_CONTENT_ERROR_INVALID_PARAMETER, "invalid tag update");
+
+       _tag->tag_id = tag_id;
+
+       return media_tag_update_to_db(tag);
+}