gchar * grl_tracker_tracker_get_insert_string (GrlMedia *media, const GList *keys) { gboolean first = TRUE; const GList *key; GString *gstr = g_string_new (""); for (key = keys; key != NULL; key = key->next) { const GList *assoc_list; GrlKeyID key_id = GRLPOINTER_TO_KEYID (key->data); for (assoc_list = get_mapping_from_grl (key_id); assoc_list != NULL; assoc_list = assoc_list->next) { tracker_grl_sparql_t *assoc = assoc_list->data; if (assoc == NULL) continue; /* The favourite key is really setting or deleting a tag * in tracker, so in the case of setting it to false skip * the insert string creation step for this key completely. */ if (assoc->grl_key == GRL_METADATA_KEY_FAVOURITE && !grl_media_get_favourite (media)) continue; if (!grl_data_has_key (GRL_DATA (media), key_id)) continue; if (!first) g_string_append (gstr, " ; "); gen_prop_insert_string (gstr, assoc, GRL_DATA (media)); first = FALSE; } } return g_string_free (gstr, FALSE); }
static gboolean bind_and_exec (sqlite3 *db, const gchar *sql, const gchar *source_id, const gchar *media_id, GList *col_names, GList *keys, GrlMedia *media) { gint r; const gchar *char_value; gint int_value; double double_value; GList *iter_names, *iter_keys; guint count; sqlite3_stmt *stmt; /* Create statement from sql */ GRL_DEBUG ("%s", sql); r = sqlite3_prepare_v2 (db, sql, strlen (sql), &stmt, NULL); if (r != SQLITE_OK) { GRL_WARNING ("Failed to update metadata for '%s - %s': %s", source_id, media_id, sqlite3_errmsg (db)); sqlite3_finalize (stmt); return FALSE; } /* Bind media type */ sqlite3_bind_int (stmt, 1, get_media_type (media)); /* Bind column values */ count = 2; iter_names = col_names; iter_keys = keys; while (iter_names) { if (iter_names->data) { GrlKeyID key = GRLPOINTER_TO_KEYID (iter_keys->data); if (key == GRL_METADATA_KEY_RATING) { double_value = grl_media_get_rating (media); sqlite3_bind_double (stmt, count, double_value); } else if (key == GRL_METADATA_KEY_PLAY_COUNT) { int_value = grl_media_get_play_count (media); sqlite3_bind_int (stmt, count, int_value); } else if (key == GRL_METADATA_KEY_LAST_POSITION) { int_value = grl_media_get_last_position (media); sqlite3_bind_int (stmt, count, int_value); } else if (key == GRL_METADATA_KEY_LAST_PLAYED) { char_value = grl_media_get_last_played (media); sqlite3_bind_text (stmt, count, char_value, -1, SQLITE_STATIC); } else if (key == GRL_METADATA_KEY_FAVOURITE) { int_value = (gint) grl_media_get_favourite (media); sqlite3_bind_int (stmt, count, int_value); } count++; } iter_keys = g_list_next (iter_keys); iter_names = g_list_next (iter_names); } sqlite3_bind_text (stmt, count++, source_id, -1, SQLITE_STATIC); sqlite3_bind_text (stmt, count++, media_id, -1, SQLITE_STATIC); /* execute query */ while ((r = sqlite3_step (stmt)) == SQLITE_BUSY); sqlite3_finalize (stmt); return (r == SQLITE_DONE); }