diff --git a/inc/lektor/database.h b/inc/lektor/database.h index d5632e3c18bbc0632e7e7c2edaf33a6d706e5af0..e26b78f14089117b8bc4c83e49ecf6e248bbf5a9 100644 --- a/inc/lektor/database.h +++ b/inc/lektor/database.h @@ -131,6 +131,8 @@ typedef bool (*database_sticker_callback_t)(void *args, const char *sticker, con bool database_sticker_create(sqlite3 *db, const char *name); bool database_sticker_delete(sqlite3 *db, const char *name); +bool database_sticker_delete_specify(sqlite3 *sb, const char *type, int uri, + const char *name /* Can be null */); bool database_sticker_list(sqlite3 *db, const char *type, void *args, database_sticker_callback_t call); bool database_sticker_set(sqlite3 *db, const char *type, const char *name, int uri, int value); bool database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, void *args, diff --git a/src/database/stickers.c b/src/database/stickers.c index 1c0a4ab73247b4f9ef95fc3d627c8c08a0f1e020..b0abae8e4e512c925809e5ffa08bd1856796ebf4 100644 --- a/src/database/stickers.c +++ b/src/database/stickers.c @@ -150,7 +150,7 @@ database_sticker_set(sqlite3 *db, const char *type, const char *name, int uri, i "SELECT ?, 'stickers'.id, ? " "FROM 'stickers'" "WHERE 'stickers'.id = ?;\n"; - else if (!strcasecmp(type, "song")) + else if (!strcasecmp(type, "plt")) SQL = "INSERT OR REPLACE INTO 'stickers.plt' (id, sticker, value) " "SELECT ?, 'stickers'.id, ? " @@ -193,12 +193,12 @@ database_sticker_get(sqlite3 *db, const char *type, const char *name, int uri, v "JOIN 'stickers.song'" " ON 'stickers'.id = 'stickers.song'.sticker" " AND 'stickers'.name = ?;\n"; - else if (!strcasecmp(type, "song")) + else if (!strcasecmp(type, "plt")) SQL = "SELECT value " "FROM 'stickers' " - "JOIN 'stickers.song'" - " ON 'stickers'.id = 'stickers.song'.sticker" + "JOIN 'stickers.plt'" + " ON 'stickers'.id = 'stickers.plt'.sticker" " AND 'stickers'.name = ?;\n"; else { fprintf(stderr, " . database_sticker_get: Type '%s' is invalid\n", type); @@ -230,3 +230,48 @@ error: sqlite3_finalize(stmt); return ret; } + +bool +database_sticker_delete_specify(sqlite3 *db, const char *type, int uri, const char *name) +{ + const char *SQL = NULL; + sqlite3_stmt *stmt; + int ret = false; + + /* Tout pouris, refaire ça (FIXME). */ + if (!strcasecmp(type, "song")) { + if (!name) + SQL = "DELETE FROM 'stickers.song' WHERE id = ?;"; + else + SQL = + "DELETE FROM 'stickers.song' " + "WHERE 'stickers.song'.id = ? " + "AND sticker = (SELECT id FROM 'stickers' WHERE name = ? LIMIT 1);"; + } else if (!strcasecmp(type, "plt")) { + if (!name) + SQL = "DELETE FROM 'stickers.plt' WHERE id = ?;"; + else + SQL = + "DELETE FROM 'stickers.plt' " + "WHERE 'stickers.plt'.id = ? " + "AND sticker = (SELECT id FROM 'stickers' WHERE name = ? LIMIT 1);"; + } else { + fprintf(stderr, " . database_sticker_get: Type '%s' is invalid\n", type); + return false; + } + + SQLITE_PREPARE(db, stmt, SQL, error); + SQLITE_BIND_INT(db, stmt, 1, uri, error); + + if (name) + SQLITE_BIND_TEXT(db, stmt, 2, name, error); + + if (! (ret = (sqlite3_step(stmt) == SQLITE_OK))) { + fprintf(stderr, " . database_sticker_delete_specify: Failed to delete sticker\n"); + goto error; + } + ret = true; +error: + sqlite3_finalize(stmt); + return ret; +}