static void grl_metadata_store_source_class_finalize (GObject *object) { GrlMetadataStoreSource *source = GRL_METADATA_STORE_SOURCE (object); sqlite3_close (source->priv->db); G_OBJECT_CLASS (grl_metadata_store_source_parent_class)->finalize (object); }
static void grl_metadata_store_source_resolve (GrlSource *source, GrlSourceResolveSpec *rs) { const gchar *source_id, *media_id; sqlite3_stmt *stmt; GError *error = NULL; GRL_DEBUG (__FUNCTION__); source_id = grl_media_get_source (rs->media); media_id = grl_media_get_id (rs->media); /* We need the source id */ if (!source_id) { GRL_WARNING ("Failed to resolve metadata: source-id not available"); error = g_error_new (GRL_CORE_ERROR, GRL_CORE_ERROR_RESOLVE_FAILED, _("Failed to resolve: %s"), _("\"source-id\" not available")); rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, error); g_error_free (error); return; } /* Special case for root categories */ if (!media_id) { media_id = ""; } stmt = query_metadata_store (GRL_METADATA_STORE_SOURCE (source)->priv->db, source_id, media_id); if (stmt) { fill_metadata (rs->media, rs->keys, stmt); rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, NULL); } else { GRL_WARNING ("Failed to resolve metadata"); error = g_error_new_literal (GRL_CORE_ERROR, GRL_CORE_ERROR_RESOLVE_FAILED, _("Failed to resolve")); rs->callback (rs->source, rs->operation_id, rs->media, rs->user_data, error); g_error_free (error); } }
static void grl_metadata_store_source_store_metadata (GrlSource *source, GrlSourceStoreMetadataSpec *sms) { GRL_DEBUG ("grl_metadata_store_source_set_metadata"); const gchar *media_id, *source_id; GError *error = NULL; GList *failed_keys = NULL; source_id = grl_media_get_source (sms->media); media_id = grl_media_get_id (sms->media); /* We need the source id */ if (!source_id) { GRL_WARNING ("Failed to update metadata: source-id not available"); error = g_error_new (GRL_CORE_ERROR, GRL_CORE_ERROR_STORE_METADATA_FAILED, _("Failed to update metadata: %s"), _("\"source-id\" not available")); failed_keys = g_list_copy (sms->keys); } else { /* Special case for root categories */ if (!media_id) { media_id = ""; } failed_keys = write_keys (GRL_METADATA_STORE_SOURCE (source)->priv->db, source_id, media_id, sms, &error); } sms->callback (sms->source, sms->media, failed_keys, sms->user_data, error); g_clear_error (&error); g_list_free (failed_keys); }
static void grl_metadata_store_source_search (GrlSource *source, GrlSourceSearchSpec *ss) { sqlite3_stmt *sql_stmt = NULL; sqlite3 *db; gchar *sql; gint r; gint i; GError *error = NULL; GrlMedia *media; GList *iter, *medias = NULL; GValue *filter_favourite_val; GValue *filter_source_val; GrlTypeFilter filter_type_val; GString *filters; guint count; gint type_filter[3]; GRL_DEBUG (__FUNCTION__); db = GRL_METADATA_STORE_SOURCE (source)->priv->db; if (!db) { GRL_WARNING ("Can't execute operation: no database connection."); error = g_error_new_literal (GRL_CORE_ERROR, GRL_CORE_ERROR_QUERY_FAILED, _("No database connection")); ss->callback (ss->source, ss->operation_id, NULL, 0, ss->user_data, error); g_error_free (error); return; } filters = g_string_new (""); filter_favourite_val = grl_operation_options_get_key_filter (ss->options, GRL_METADATA_KEY_FAVOURITE); filter_source_val = grl_operation_options_get_key_filter (ss->options, GRL_METADATA_KEY_SOURCE); filter_type_val = grl_operation_options_get_type_filter (ss->options); if (filter_favourite_val) { filters = g_string_append (filters, GRL_SQL_FAVOURITE_FILTER); } if (filter_source_val) { if (filters->len > 0) { filters = g_string_append (filters, " AND "); } filters = g_string_append (filters, GRL_SQL_SOURCE_FILTER); } if (filter_type_val != GRL_TYPE_FILTER_ALL) { /* Fill the type_filter array */ if (filter_type_val & GRL_TYPE_FILTER_AUDIO) { type_filter[0] = MEDIA_AUDIO; } else { type_filter[0] = -1; } if (filter_type_val & GRL_TYPE_FILTER_VIDEO) { type_filter[1] = MEDIA_VIDEO; } else { type_filter[1] = -1; } if (filter_type_val & GRL_TYPE_FILTER_IMAGE) { type_filter[2] = MEDIA_IMAGE; } else { type_filter[2] = -1; } if (filters->len > 0) { filters = g_string_append (filters, " AND "); } filters = g_string_append (filters, GRL_SQL_TYPE_FILTER); } if (filters->len > 0) { sql = g_strdup_printf (GRL_SQL_SEARCH_FILTER, filters->str, grl_operation_options_get_count (ss->options), grl_operation_options_get_skip (ss->options)); } else { sql = g_strdup_printf (GRL_SQL_SEARCH, grl_operation_options_get_count (ss->options), grl_operation_options_get_skip (ss->options)); } r = sqlite3_prepare_v2 (db, sql, -1, &sql_stmt, NULL); g_free (sql); g_string_free (filters, TRUE); if (r != SQLITE_OK) { GRL_WARNING ("Failed to search in the metadata store: %s", sqlite3_errmsg (db)); error = g_error_new (GRL_CORE_ERROR, GRL_CORE_ERROR_SEARCH_FAILED, _("Failed to search: %s"), sqlite3_errmsg (db)); ss->callback (ss->source, ss->operation_id, NULL, 0, ss->user_data, error); g_error_free (error); return; } count = 1; if (filter_favourite_val) { sqlite3_bind_int (sql_stmt, count++, (gint) g_value_get_boolean (filter_favourite_val)); } if (filter_source_val) { sqlite3_bind_text (sql_stmt, count++, g_value_get_string (filter_source_val), -1, SQLITE_STATIC); } if (filter_type_val != GRL_TYPE_FILTER_ALL) { for (i = 0; i < G_N_ELEMENTS (type_filter); i++) { sqlite3_bind_int (sql_stmt, count++, type_filter[i]); } } while ((r = sqlite3_step (sql_stmt)) == SQLITE_BUSY); count = 0; while (r == SQLITE_ROW) { media = create_media (sql_stmt, ss->keys); medias = g_list_prepend (medias, media); count++; r = sqlite3_step (sql_stmt); } if (r != SQLITE_DONE) { GRL_WARNING ("Failed to search in the metadata store: %s", sqlite3_errmsg (db)); error = g_error_new (GRL_CORE_ERROR, GRL_CORE_ERROR_SEARCH_FAILED, _("Failed to search: %s"), sqlite3_errmsg (db)); ss->callback (ss->source, ss->operation_id, NULL, 0, ss->user_data, error); g_error_free (error); sqlite3_finalize (sql_stmt); return; } sqlite3_finalize (sql_stmt); if (count > 0) { iter = medias; while (iter) { media = GRL_MEDIA (iter->data); ss->callback (ss->source, ss->operation_id, media, --count, ss->user_data, NULL); iter = g_list_next (iter); } g_list_free (medias); } else { ss->callback (ss->source, ss->operation_id, NULL, 0, ss->user_data, NULL); } }