sticker: added sticker_delete_value()
sticker_delete_value() deletes only one value in a sticker, while the old function sticker_delete() deletes all values.
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
|
@@ -48,6 +48,13 @@ sticker_song_set_value(const struct song *song,
|
|||||||
bool
|
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.
|
||||||
*
|
*
|
||||||
|
@@ -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[] = {
|
|||||||
"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)
|
|||||||
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)
|
||||||
{
|
{
|
||||||
|
@@ -88,6 +88,13 @@ sticker_store_value(const char *type, const char *uri,
|
|||||||
bool
|
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.
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user