static xmmsv_t * medialib_query (xmmsv_coll_t *coll, xmmsv_t *spec, xmms_error_t *err) { xmms_medialib_session_t *session; xmmsv_t *ret; session = xmms_medialib_session_begin (medialib); ret = xmms_medialib_query (session, coll, spec, err); xmms_medialib_session_commit (session); return ret; }
/** * Performance test predicate */ static gboolean run_performance_test (xmms_medialib_t *medialib, const gchar *name, xmmsv_t *content, xmmsv_t *coll, xmmsv_t *specification, xmmsv_t *expected, gint format, const gchar *datasetname) { xmms_medialib_session_t *session; xmms_error_t err; GTimeVal t0, t1; guint64 duration; xmmsv_t *ret; session = xmms_medialib_session_begin (medialib); g_get_current_time (&t0); ret = xmms_medialib_query (session, coll, specification, &err); g_get_current_time (&t1); xmms_medialib_session_commit (session); duration = (guint64)((t1.tv_sec - t0.tv_sec) * G_USEC_PER_SEC) + (t1.tv_usec - t0.tv_usec); if (format == FORMAT_PRETTY) g_print ("* Test %s\n", name); if (xmms_error_iserror (&err)) { if (format == FORMAT_CSV) { g_print ("\"%s\",\"%s\",0,0\n", datasetname, name); } else { g_print (" - Query failed: %s\n", xmms_error_message_get (&err)); } } else { if (format == FORMAT_CSV) { g_print ("\"%s\",\"%s\",1,%" G_GUINT64_FORMAT "\n", datasetname, name, duration); } else { g_print (" - Time elapsed: %.3fms\n", duration / 1000.0); } } xmmsv_unref (ret); return TRUE; }
/** * Returns a random entry from a collection * * @param coll The collection to find a random entry in * @return A random entry from the collection, 0 if the collection is empty */ xmms_medialib_entry_t xmms_medialib_query_random_id (xmms_medialib_session_t *session, xmmsv_t *coll) { xmms_medialib_entry_t ret; xmmsv_t *spec, *res; xmms_error_t err; spec = xmmsv_build_list (XMMSV_LIST_ENTRY_STR ("id"), XMMSV_LIST_END); spec = xmmsv_build_dict (XMMSV_DICT_ENTRY_STR ("type", "metadata"), XMMSV_DICT_ENTRY_STR ("aggregate", "random"), XMMSV_DICT_ENTRY ("get", spec), XMMSV_DICT_END); res = xmms_medialib_query (session, coll, spec, &err); xmmsv_get_int (res, &ret); xmmsv_unref (spec); xmmsv_unref (res); return ret; }
/** * Unit test predicate */ static void run_unit_test (xmms_medialib_t *mlib, const gchar *name, xmmsv_t *content, xmmsv_coll_t *coll, xmmsv_t *specification, xmmsv_t *expected, gint format, const gchar *datasetname) { gboolean matches, ordered = FALSE; xmmsv_t *ret, *value; xmms_error_t err; xmms_medialib_t *medialib; xmms_medialib_session_t *session; g_debug ("Running test: %s", name); xmms_ipc_init (); xmms_config_init ("memory://"); xmms_config_property_register ("medialib.path", "memory://", NULL, NULL); medialib = xmms_medialib_init (); populate_medialib (medialib, content); session = xmms_medialib_session_begin (medialib); ret = xmms_medialib_query (session, coll, specification, &err); xmms_medialib_session_commit (session); xmmsv_dict_get (expected, "result", &value); xmmsv_dict_entry_get_int (expected, "ordered", &ordered); if (ordered) { matches = xmmsv_compare (ret, value); } else { matches = xmmsv_compare_unordered (ret, value); } if (matches) { if (format == FORMAT_CSV) { g_print ("\"%s\", 1\n", name); } else { g_print ("............................................................ Success!"); g_print ("\r%s \n", name); } } else { if (format == FORMAT_CSV) { g_print ("\"%s\", 0\n", name); } else { g_print ("............................................................ Failure!"); g_print ("\r%s \n", name); } g_printerr ("The result: "); xmmsv_dump (ret); g_printerr ("Does not equal: "); xmmsv_dump (value); } xmmsv_unref (ret); xmms_object_unref (medialib); xmms_config_shutdown (); xmms_ipc_shutdown (); }
/** Sorts the playlist by properties. * * This will sort the list. * @param playlist The playlist to sort. * @param properties Tells xmms_playlist_sort which properties it * should use when sorting. * @param err An #xmms_error_t - needed since xmms_playlist_sort is an ipc * method handler. */ static void xmms_playlist_client_sort (xmms_playlist_t *playlist, const gchar *plname, xmmsv_t *properties, xmms_error_t *err) { xmmsv_t *tmp, *idlist, *val, *spec, *metadata, *get; xmmsv_coll_t *plcoll, *ordered; gint currpos, pos; xmms_medialib_entry_t currid; g_return_if_fail (playlist); g_return_if_fail (properties); if (xmmsv_list_get_size (properties) < 1) { xmms_error_set (err, XMMS_ERROR_NOENT, "need at least one property to sort"); return; } g_mutex_lock (playlist->mutex); plcoll = xmms_playlist_get_coll (playlist, plname, err); if (plcoll == NULL) { xmms_error_set (err, XMMS_ERROR_NOENT, "no such playlist!"); g_mutex_unlock (playlist->mutex); return; } currpos = xmms_playlist_coll_get_currpos (plcoll); xmmsv_coll_idlist_get_index (plcoll, currpos, &currid); get = xmmsv_new_list (); xmmsv_list_append_string (get, "id"); metadata = xmmsv_new_dict (); xmmsv_dict_set_string (metadata, "type", "metadata"); xmmsv_dict_set_string (metadata, "aggregate", "first"); xmmsv_dict_set (metadata, "get", get); xmmsv_unref (get); spec = xmmsv_new_dict (); xmmsv_dict_set_string (spec, "type", "cluster-list"); xmmsv_dict_set_string (spec, "cluster-by", "position"); xmmsv_dict_set (spec, "data", metadata); xmmsv_unref (metadata); ordered = xmmsv_coll_add_order_operators (plcoll, properties); MEDIALIB_BEGIN (playlist->medialib); tmp = xmms_medialib_query (session, ordered, spec, err); MEDIALIB_COMMIT (); xmmsv_coll_unref (ordered); xmmsv_unref (spec); if (tmp == NULL) { g_mutex_unlock (playlist->mutex); return; } idlist = xmmsv_coll_idlist_get (plcoll); xmmsv_list_clear (idlist); for (pos = 0; xmmsv_list_get (tmp, pos, &val); pos++) { xmms_medialib_entry_t id; xmmsv_get_int (val, &id); xmmsv_list_append (idlist, val); if (id == currid) { xmms_collection_set_int_attr (plcoll, "position", pos); currpos = pos; } } xmmsv_unref (tmp); XMMS_PLAYLIST_CHANGED_MSG (XMMS_PLAYLIST_CHANGED_SORT, 0, plname); XMMS_PLAYLIST_CURRPOS_MSG (currpos, plname); g_mutex_unlock (playlist->mutex); }