Commit 610940a0 authored by Max Kellermann's avatar Max Kellermann

sticker: added sticker_delete_value()

sticker_delete_value() deletes only one value in a sticker, while the old function sticker_delete() deletes all values.
parent 7d9316a5
...@@ -75,6 +75,22 @@ sticker_song_delete(const struct song *song) ...@@ -75,6 +75,22 @@ sticker_song_delete(const struct song *song)
return ret; return ret;
} }
bool
sticker_song_delete_value(const struct song *song, const char *name)
{
char *uri;
bool success;
assert(song != NULL);
assert(song_in_database(song));
uri = song_get_uri(song);
success = sticker_delete_value("song", uri, name);
g_free(uri);
return success;
}
struct sticker * struct sticker *
sticker_song_get(const struct song *song) sticker_song_get(const struct song *song)
{ {
......
...@@ -49,6 +49,13 @@ bool ...@@ -49,6 +49,13 @@ bool
sticker_song_delete(const struct song *song); sticker_song_delete(const struct song *song);
/** /**
* Deletes a sticker value. Does nothing if the sticker did not
* exist.
*/
bool
sticker_song_delete_value(const struct song *song, const char *name);
/**
* Loads the sticker for the specified song. * Loads the sticker for the specified song.
* *
* @param song the song object * @param song the song object
......
...@@ -37,6 +37,7 @@ enum sticker_sql { ...@@ -37,6 +37,7 @@ enum sticker_sql {
STICKER_SQL_UPDATE, STICKER_SQL_UPDATE,
STICKER_SQL_INSERT, STICKER_SQL_INSERT,
STICKER_SQL_DELETE, STICKER_SQL_DELETE,
STICKER_SQL_DELETE_VALUE,
STICKER_SQL_FIND, STICKER_SQL_FIND,
}; };
...@@ -51,6 +52,8 @@ static const char *const sticker_sql[] = { ...@@ -51,6 +52,8 @@ static const char *const sticker_sql[] = {
"INSERT INTO sticker(type,uri,name,value) VALUES(?, ?, ?, ?)", "INSERT INTO sticker(type,uri,name,value) VALUES(?, ?, ?, ?)",
[STICKER_SQL_DELETE] = [STICKER_SQL_DELETE] =
"DELETE FROM sticker WHERE type=? AND uri=?", "DELETE FROM sticker WHERE type=? AND uri=?",
[STICKER_SQL_DELETE_VALUE] =
"DELETE FROM sticker WHERE type=? AND uri=? AND name=?",
[STICKER_SQL_FIND] = [STICKER_SQL_FIND] =
"SELECT uri,value FROM sticker WHERE type=? AND uri LIKE (? || '%') AND name=?", "SELECT uri,value FROM sticker WHERE type=? AND uri LIKE (? || '%') AND name=?",
}; };
...@@ -439,6 +442,58 @@ sticker_delete(const char *type, const char *uri) ...@@ -439,6 +442,58 @@ sticker_delete(const char *type, const char *uri)
return true; return true;
} }
bool
sticker_delete_value(const char *type, const char *uri, const char *name)
{
sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_DELETE_VALUE];
int ret;
assert(sticker_enabled());
assert(type != NULL);
assert(uri != NULL);
sqlite3_reset(stmt);
ret = sqlite3_bind_text(stmt, 1, type, -1, NULL);
if (ret != SQLITE_OK) {
g_warning("sqlite3_bind_text() failed: %s",
sqlite3_errmsg(sticker_db));
return false;
}
ret = sqlite3_bind_text(stmt, 2, uri, -1, NULL);
if (ret != SQLITE_OK) {
g_warning("sqlite3_bind_text() failed: %s",
sqlite3_errmsg(sticker_db));
return false;
}
ret = sqlite3_bind_text(stmt, 3, name, -1, NULL);
if (ret != SQLITE_OK) {
g_warning("sqlite3_bind_text() failed: %s",
sqlite3_errmsg(sticker_db));
return false;
}
do {
ret = sqlite3_step(stmt);
} while (ret == SQLITE_BUSY);
if (ret != SQLITE_DONE) {
g_warning("sqlite3_step() failed: %s",
sqlite3_errmsg(sticker_db));
return false;
}
ret = sqlite3_changes(sticker_db);
sqlite3_reset(stmt);
sqlite3_clear_bindings(stmt);
idle_add(IDLE_STICKER);
return ret > 0;
}
static struct sticker * static struct sticker *
sticker_new(void) sticker_new(void)
{ {
......
...@@ -89,6 +89,13 @@ bool ...@@ -89,6 +89,13 @@ bool
sticker_delete(const char *type, const char *uri); sticker_delete(const char *type, const char *uri);
/** /**
* Deletes a sticker value. Fails if no sticker with this name
* exists.
*/
bool
sticker_delete_value(const char *type, const char *uri, const char *name);
/**
* Frees resources held by the sticker object. * Frees resources held by the sticker object.
* *
* @param sticker the sticker object to be freed * @param sticker the sticker object to be freed
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment