aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-04-28 20:23:27 +0200
committerMax Kellermann <max@duempel.org>2009-04-28 20:23:27 +0200
commit610940a06dc09fc14581cffc2829358e926ec9c3 (patch)
treed625b3f12f3cdc7221dd63876a783cbae20ecae2
parent7d9316a52d935ce6c9f4ae3030c975d660a02db6 (diff)
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.c16
-rw-r--r--src/song_sticker.h7
-rw-r--r--src/sticker.c55
-rw-r--r--src/sticker.h7
4 files changed, 85 insertions, 0 deletions
diff --git a/src/song_sticker.c b/src/song_sticker.c
index 131519bc..2758ff53 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 435e4c93..9652052e 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 e2d774f3..0d30fbb7 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 5daba3de..8e641091 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