Example #1
0
void
xmms_medialib_entry_cleanup (xmms_medialib_session_t *session,
                             xmms_medialib_entry_t entry)
{
	s4_resultset_t *set;
	s4_val_t *song_id;
	gint i;

	song_id = s4_val_new_int (entry);

	set = xmms_medialib_filter (session, "song_id", song_id,
	                            S4_COND_PARENT, NULL, NULL, S4_FETCH_DATA);


	for (i = 0; i < s4_resultset_get_rowcount (set); i++) {
		const s4_result_t *res;

		res = s4_resultset_get_result (set, i, 0);
		while (res != NULL) {
			const gchar *src = s4_result_get_src (res);
			const gchar *key = s4_result_get_key (res);

			if (entry_attribute_is_derived (src, key)) {
				const s4_val_t *value = s4_result_get_val (res);
				xmms_medialib_session_property_unset (session, entry, key,
				                                      value, src);
			}

			res = s4_result_next (res);
		}
	}

	s4_resultset_free (set);
	s4_val_free (song_id);
}
Example #2
0
gint
xmms_medialib_session_property_unset (xmms_medialib_session_t *session,
                                      xmms_medialib_entry_t entry,
                                      const gchar *key,
                                      const s4_val_t *value,
                                      const gchar *source)
{
	GHashTable *events;
	s4_val_t *song_id;
	gint result;

	song_id = s4_val_new_int (entry);
	result = s4_del (session->trans, "song_id", song_id,
	                 key, value, source);
	s4_val_free (song_id);

	if (strcmp (key, XMMS_MEDIALIB_ENTRY_PROPERTY_URL) == 0) {
		events = xmms_medialib_session_get_table (&session->removed);
	} else {
		events = xmms_medialib_session_get_table (&session->updated);
	}

	g_hash_table_insert (events,
	                     GINT_TO_POINTER (entry),
	                     GINT_TO_POINTER (entry));

	return result;
}
Example #3
0
/**
 * Remove a medialib entry from the database
 *
 * @param id_num Entry to remove
 */
void
xmms_medialib_entry_remove (xmms_medialib_session_t *session,
                            xmms_medialib_entry_t entry)
{
	s4_resultset_t *set;
	s4_val_t *song_id;
	gint i;

	song_id = s4_val_new_int (entry);

	set = xmms_medialib_filter (session, "song_id", song_id,
	                            S4_COND_PARENT, NULL, NULL, S4_FETCH_DATA);

	for (i = 0; i < s4_resultset_get_rowcount (set); i++) {
		const s4_result_t *res;

		res = s4_resultset_get_result (set, i, 0);
		while (res != NULL) {
			xmms_medialib_session_property_unset (session, entry,
			                                      s4_result_get_key (res),
			                                      s4_result_get_val (res),
			                                      s4_result_get_src (res));
			res = s4_result_next (res);
		}
	}

	s4_resultset_free (set);
	s4_val_free (song_id);
}
Example #4
0
static void
xmms_medialib_property_remove (xmms_medialib_session_t *session,
                               xmms_medialib_entry_t entry,
                               const gchar *source, const gchar *key,
                               xmms_error_t *error)
{
	const char *sources[2] = { source, NULL };
	s4_sourcepref_t *sp;
	s4_resultset_t *set;
	const s4_result_t *res;
	s4_val_t *song_id;

	sp = s4_sourcepref_create (sources);

	song_id = s4_val_new_int (entry);
	set = xmms_medialib_filter (session, "song_id", song_id,
	                            S4_COND_PARENT, sp, key, S4_FETCH_DATA);

	res = s4_resultset_get_result (set, 0, 0);
	if (res != NULL) {
		xmms_medialib_session_property_unset (session, entry, key,
		                                      s4_result_get_val (res),
		                                      source);
	}

	s4_resultset_free (set);
	s4_sourcepref_unref (sp);
	s4_val_free (song_id);
}
Example #5
0
gint
xmms_medialib_session_property_set (xmms_medialib_session_t *session,
                                    xmms_medialib_entry_t entry,
                                    const gchar *key,
                                    const s4_val_t *value,
                                    const gchar *source)
{
	const gchar *sources[2] = { source, NULL };
	const s4_result_t *res;
	s4_condition_t *cond;
	s4_fetchspec_t *spec;
	s4_resultset_t *set;
	s4_sourcepref_t *sp;
	s4_val_t *song_id;
	gint result;
	GHashTable *events;

	song_id = s4_val_new_int (entry);

	sp = s4_sourcepref_create (sources);

	cond = s4_cond_new_filter (S4_FILTER_EQUAL, "song_id", song_id,
	                           sp, S4_CMP_CASELESS, S4_COND_PARENT);

	spec = s4_fetchspec_create ();
	s4_fetchspec_add (spec, key, sp, S4_FETCH_DATA);

	set = s4_query (session->trans, spec, cond);
	s4_cond_free (cond);
	s4_fetchspec_free (spec);

	res = s4_resultset_get_result (set, 0, 0);
	if (res != NULL) {
		const s4_val_t *old_value = s4_result_get_val (res);
		s4_del (session->trans, "song_id", song_id,
		        key, old_value, source);
	}

	s4_resultset_free (set);
	s4_sourcepref_unref (sp);

	result = s4_add (session->trans, "song_id", song_id,
	                 key, value, source);

	s4_val_free (song_id);

	if (strcmp (key, XMMS_MEDIALIB_ENTRY_PROPERTY_URL) == 0) {
		events = xmms_medialib_session_get_table (&session->added);
	} else {
		events = xmms_medialib_session_get_table (&session->updated);
	}

	g_hash_table_insert (events,
	                     GINT_TO_POINTER (entry),
	                     GINT_TO_POINTER (entry));

	return result;
}
Example #6
0
static s4_resultset_t *
not_resolved_set (xmms_medialib_session_t *session)
{
	s4_condition_t *cond1, *cond2, *cond;
	s4_sourcepref_t *sourcepref;
	s4_fetchspec_t *spec;
	s4_resultset_t *ret;
	s4_val_t *v1, *v2;

	sourcepref = xmms_medialib_session_get_source_preferences (session);

	v1 = s4_val_new_int (XMMS_MEDIALIB_ENTRY_STATUS_NEW);
	v2 = s4_val_new_int (XMMS_MEDIALIB_ENTRY_STATUS_REHASH);

	cond1 = s4_cond_new_filter (S4_FILTER_EQUAL,
	                            XMMS_MEDIALIB_ENTRY_PROPERTY_STATUS,
	                            v1, sourcepref, S4_CMP_CASELESS, 0);
	cond2 = s4_cond_new_filter (S4_FILTER_EQUAL,
	                            XMMS_MEDIALIB_ENTRY_PROPERTY_STATUS,
	                            v2, sourcepref, S4_CMP_CASELESS, 0);

	cond = s4_cond_new_combiner (S4_COMBINE_OR);
	s4_cond_add_operand (cond, cond1);
	s4_cond_add_operand (cond, cond2);

	spec = s4_fetchspec_create ();
	s4_fetchspec_add (spec, "song_id", sourcepref, S4_FETCH_PARENT);


	ret = xmms_medialib_session_query (session, spec, cond);

	s4_sourcepref_unref (sourcepref);
	s4_fetchspec_free (spec);
	s4_cond_free (cond);
	s4_cond_free (cond1);
	s4_cond_free (cond2);
	s4_val_free (v1);
	s4_val_free (v2);

	return ret;
}
Example #7
0
File: val.c Project: dchokola/s4
/**
 * Copies a value
 *
 * @param val The value to copy
 * @return A new value that's a copy of val, must be freed with s4_val_free
 */
s4_val_t *s4_val_copy (const s4_val_t *val)
{
	const char *s;
	int32_t i;

	if (s4_val_get_str (val, &s)) {
		return s4_val_new_string (s);
	} else if (s4_val_get_int (val, &i)) {
		return s4_val_new_int (i);
	} else {
		return NULL;
	}
}
Example #8
0
static xmmsv_t *
xmms_medialib_entry_to_tree (xmms_medialib_session_t *session,
                             xmms_medialib_entry_t entry)
{
	s4_resultset_t *set;
	s4_val_t *song_id;
	xmmsv_t *ret, *id;
	gint i;

	song_id = s4_val_new_int (entry);
	set = xmms_medialib_filter (session, "song_id", song_id, S4_COND_PARENT,
	                            NULL, NULL, S4_FETCH_PARENT | S4_FETCH_DATA);
	s4_val_free (song_id);

	ret = xmmsv_new_dict ();

	for (i = 0; i < s4_resultset_get_rowcount (set); i++) {
		const s4_result_t *res;

		res = s4_resultset_get_result (set, 0, 0);
		while (res != NULL) {
			xmmsv_t *v_entry = NULL;
			const s4_val_t *val;
			const char *s;
			gint32 i;

			val = s4_result_get_val (res);
			if (s4_val_get_str (val, &s)) {
				v_entry = xmmsv_new_string (s);
			} else if (s4_val_get_int (val, &i)) {
				v_entry = xmmsv_new_int (i);
			}

			xmms_medialib_tree_add_tuple (ret, s4_result_get_key (res),
			                              s4_result_get_src (res), v_entry);
			xmmsv_unref (v_entry);

			res = s4_result_next (res);
		}
	}

	s4_resultset_free (set);

	id = xmmsv_new_int (entry);
	xmms_medialib_tree_add_tuple (ret, "id", "server", id);
	xmmsv_unref (id);

	return ret;
}
Example #9
0
File: const.c Project: dchokola/s4
const s4_val_t *_int_lookup_val (s4_t *s4, int32_t i)
{
	const s4_val_t *ret;

	g_mutex_lock (&s4->const_data->int_lock);
	ret = g_hash_table_lookup (s4->const_data->int_table, GINT_TO_POINTER (i));

	if (ret == NULL) {
		ret = s4_val_new_int (i);
		g_hash_table_insert (s4->const_data->int_table, GINT_TO_POINTER (i), (void*)ret);
	}

	g_mutex_unlock (&s4->const_data->int_lock);

	return ret;
}
Example #10
0
gboolean
xmms_medialib_entry_property_set_int_source (xmms_medialib_session_t *session,
                                             xmms_medialib_entry_t id_num,
                                             const gchar *property, gint value,
                                             const gchar *source)
{
	gboolean ret;
	s4_val_t *prop;

	g_return_val_if_fail (property, FALSE);

	prop = s4_val_new_int (value);
	ret = xmms_medialib_session_property_set (session, id_num, property, prop, source);
	s4_val_free (prop);

	return ret;
}
Example #11
0
static void
xmms_medialib_client_rehash (xmms_medialib_t *medialib,
                             xmms_medialib_entry_t entry,
                             xmms_error_t *error)
{
	xmms_medialib_session_t *session;

	do {
		session = xmms_medialib_session_begin (medialib);
		if (xmms_medialib_check_id (session, entry)) {
			xmms_medialib_entry_status_set (session, entry, XMMS_MEDIALIB_ENTRY_STATUS_REHASH);
		} else if (entry == 0) {
			s4_sourcepref_t *sourcepref;
			s4_resultset_t *set;
			s4_val_t *status;
			gint i;

			sourcepref = xmms_medialib_session_get_source_preferences (session);

			status = s4_val_new_int (XMMS_MEDIALIB_ENTRY_STATUS_OK);
			set = xmms_medialib_filter (session, XMMS_MEDIALIB_ENTRY_PROPERTY_STATUS,
			                            status, 0, sourcepref, "song_id", S4_FETCH_PARENT);
			s4_val_free (status);
			s4_sourcepref_unref (sourcepref);

			for (i = 0; i < s4_resultset_get_rowcount (set); i++) {
				const s4_result_t *res;

				res = s4_resultset_get_result (set, i, 0);
				for (; res != NULL; res = s4_result_next (res)) {
					xmms_medialib_entry_t item;
					s4_val_get_int (s4_result_get_val (res), &item);
					xmms_medialib_entry_status_set (session, item, XMMS_MEDIALIB_ENTRY_STATUS_REHASH);
				}
			}

			s4_resultset_free (set);
		} else {
			xmms_error_set (error, XMMS_ERROR_NOENT, "No such entry");
		}
	} while (!xmms_medialib_session_commit (session));
}
Example #12
0
static s4_val_t *
xmms_medialib_entry_property_get (xmms_medialib_session_t *session,
                                  xmms_medialib_entry_t entry,
                                  const gchar *property)
{
	s4_sourcepref_t *sourcepref;
	const s4_result_t *res;
	s4_resultset_t *set;
	s4_val_t *ret = NULL;
	s4_val_t *song_id;

	g_return_val_if_fail (property, NULL);

	song_id = s4_val_new_int (entry);

	if (strcmp (property, XMMS_MEDIALIB_ENTRY_PROPERTY_ID) == 0) {
		/* only resolving attributes other than 'id' */
		return song_id;
	}

	sourcepref = xmms_medialib_session_get_source_preferences (session);

	set = xmms_medialib_filter (session, "song_id", song_id, S4_COND_PARENT,
	                            sourcepref, property, S4_FETCH_DATA);

	s4_sourcepref_unref (sourcepref);

	res = s4_resultset_get_result (set, 0, 0);
	if (res != NULL) {
		ret = s4_val_copy (s4_result_get_val (res));
	}

	s4_resultset_free (set);
	s4_val_free (song_id);

	return ret;
}
Example #13
0
int main (int argc, char *argv[])
{
	s4_t *s4;
	s4_transaction_t *t;
	int i;
	char *filename = tmpnam (NULL);
	GTimeVal cur, prev;

	g_thread_init (NULL);
	log_init(G_LOG_LEVEL_MASK & ~G_LOG_LEVEL_DEBUG);
	g_get_current_time (&prev);

	s4 = s4_open (filename, NULL, S4_NEW);

	if (s4 == NULL) {
		fprintf (stderr, "Could not open %s\n", argv[1]);
		exit (1);
	}

	take_time ("s4_open took", &prev, &cur);

	for (i = 0; i < ENTRIES; i++) {
		s4_val_t *val;
		val = s4_val_new_int (i);
		t = s4_begin (s4, 0);
		s4_add (t, "a", val, "b", val, "src");
		s4_commit (t);
		s4_val_free (val);
	}

	take_time ("s4be_ip_add took", &prev, &cur);

	for (i = 0; i < ENTRIES; i++) {
		s4_val_t *val;
		val = s4_val_new_int (i);
		t = s4_begin (s4, 0);
		s4_del (t, "a", val, "b", val, "src");
		s4_commit (t);
		s4_val_free (val);
	}

	take_time ("s4be_ip_del took", &prev, &cur);

	t = s4_begin (s4, 0);
	for (i = 0; i < ENTRIES; i++) {
		s4_val_t *val;
		val = s4_val_new_int (i);
		s4_add (t, "a", val, "b", val, "src");
		s4_val_free (val);
	}
	s4_commit (t);

	take_time ("s4be_ip_add took", &prev, &cur);

	t = s4_begin (s4, 0);
	for (i = 0; i < ENTRIES; i++) {
		s4_val_t *val;
		val = s4_val_new_int (i);
		s4_del (t, "a", val, "b", val, "src");
		s4_val_free (val);
	}
	s4_commit (t);

	take_time ("s4be_ip_del took", &prev, &cur);

	for (i = ENTRIES; i > 0; i--) {
		s4_val_t *val;
		val = s4_val_new_int (i);
		t = s4_begin (s4, 0);
		s4_add (t, "a", val, "b", val, "src");
		s4_commit (t);
		s4_val_free (val);
	}

	take_time ("s4be_ip_add (backwards) took", &prev, &cur);

	for (i = ENTRIES; i > 0; i--) {
		s4_val_t *val;
		val = s4_val_new_int (i);
		t = s4_begin (s4, 0);
		s4_del (t, "a", val, "b", val, "src");
		s4_commit (t);
		s4_val_free (val);
	}

	take_time ("s4be_ip_del (backwards) took", &prev, &cur);

	s4_close (s4);

	take_time ("s4_close took", &prev, &cur);

	g_unlink (filename);
	g_unlink (g_strconcat (filename, ".log", NULL));

	take_time ("g_unlink took", &prev, &cur);

	return 0;
}