diff options
author | Max Kellermann <max@duempel.org> | 2009-04-28 20:23:27 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2009-04-28 20:23:27 +0200 |
commit | 610940a06dc09fc14581cffc2829358e926ec9c3 (patch) | |
tree | d625b3f12f3cdc7221dd63876a783cbae20ecae2 | |
parent | 7d9316a52d935ce6c9f4ae3030c975d660a02db6 (diff) | |
download | mpd-610940a06dc09fc14581cffc2829358e926ec9c3.tar.gz mpd-610940a06dc09fc14581cffc2829358e926ec9c3.tar.xz mpd-610940a06dc09fc14581cffc2829358e926ec9c3.zip |
sticker: added sticker_delete_value()
sticker_delete_value() deletes only one value in a sticker, while
the old function sticker_delete() deletes all values.
-rw-r--r-- | src/song_sticker.c | 16 | ||||
-rw-r--r-- | src/song_sticker.h | 7 | ||||
-rw-r--r-- | src/sticker.c | 55 | ||||
-rw-r--r-- | src/sticker.h | 7 |
4 files changed, 85 insertions, 0 deletions
diff --git a/src/song_sticker.c b/src/song_sticker.c index 131519bcd..2758ff534 100644 --- a/src/song_sticker.c +++ b/src/song_sticker.c @@ -75,6 +75,22 @@ sticker_song_delete(const struct song *song) 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 * sticker_song_get(const struct song *song) { diff --git a/src/song_sticker.h b/src/song_sticker.h index 435e4c935..9652052e0 100644 --- a/src/song_sticker.h +++ b/src/song_sticker.h @@ -49,6 +49,13 @@ bool 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. * * @param song the song object diff --git a/src/sticker.c b/src/sticker.c index e2d774f3d..0d30fbb70 100644 --- a/src/sticker.c +++ b/src/sticker.c @@ -37,6 +37,7 @@ enum sticker_sql { STICKER_SQL_UPDATE, STICKER_SQL_INSERT, STICKER_SQL_DELETE, + STICKER_SQL_DELETE_VALUE, STICKER_SQL_FIND, }; @@ -51,6 +52,8 @@ static const char *const sticker_sql[] = { "INSERT INTO sticker(type,uri,name,value) VALUES(?, ?, ?, ?)", [STICKER_SQL_DELETE] = "DELETE FROM sticker WHERE type=? AND uri=?", + [STICKER_SQL_DELETE_VALUE] = + "DELETE FROM sticker WHERE type=? AND uri=? AND name=?", [STICKER_SQL_FIND] = "SELECT uri,value FROM sticker WHERE type=? AND uri LIKE (? || '%') AND name=?", }; @@ -439,6 +442,58 @@ sticker_delete(const char *type, const char *uri) 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 * sticker_new(void) { diff --git a/src/sticker.h b/src/sticker.h index 5daba3def..8e6410914 100644 --- a/src/sticker.h +++ b/src/sticker.h @@ -89,6 +89,13 @@ bool 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. * * @param sticker the sticker object to be freed |