diff --git a/src/database/playlist.c b/src/database/playlist.c index a4b9b26c71516502a54e74277a9fd2ea12841cd2..d882ef0b125af1b09eafa29d6c65789d4bb68529 100644 --- a/src/database/playlist.c +++ b/src/database/playlist.c @@ -163,38 +163,15 @@ database_plt_add_uri(volatile sqlite3 *db, const char *name, struct lkt_uri *uri) { static const char *SQL = - "WITH plt_id(id) AS (SELECT playlist.id AS id FROM playlist" - " WHERE name COLLATE nocase = ?) " - "INSERT INTO kara_playlist (kara_id, playlist_id) " - "SELECT plt_id.id, kara.id " - " FROM kara, plt_id " - " WHERE kara.%s LIKE ? " - " ORDER BY RANDOM();"; + "INSERT OR REPLACE INTO kara_playlist (kara_id, playlist_id) " + "SELECT" + " kara.id," + " (SELECT playlist.id FROM playlist WHERE name = ? COLLATE NOCASE)" + "FROM kara WHERE kara.%s LIKE ?;"; char SQL_STMT[LKT_MAX_SQLITE_STATEMENT], sta = false; - const char *column; sqlite3_stmt *stmt; - switch (uri->type) { - case uri_type: - column = LKT_DB_TYPE; - break; - case uri_author: - column = LKT_DB_AUTHOR; - break; - case uri_category: - column = LKT_DB_CAT; - break; - case uri_language: - column = LKT_DB_LANG; - break; - case uri_query: - column = LKT_DB_ALL; - break; - default: - return false; - } - - safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL, column); + safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL, uri->column_name); SQLITE_PREPARE(db, stmt, SQL_STMT, error); SQLITE_BIND_TEXT(db, stmt, 1, name, error); SQLITE_BIND_TEXT(db, stmt, 2, (char *) uri->value, error); diff --git a/src/database/queue.c b/src/database/queue.c index 92d82e63b59c3e80a1a30828716d045993e21578..9762414cc190ac529b71ceaa860eea0cff1c9277 100644 --- a/src/database/queue.c +++ b/src/database/queue.c @@ -119,8 +119,10 @@ error: if (prio > 1) { \ if (__queue_reorder(db)) { \ LOG_INFO("DB", "%s", "Queue has been reordered"); \ - } else \ + } else { \ + LOG_INFO("DB", "%s", "Failed to reorder"); \ goto error; \ + } \ } static bool @@ -131,7 +133,7 @@ __queue_reorder(volatile sqlite3 *db) " ELSE (SELECT current FROM queue_state) END AS val LIMIT 1)" static const char *SQL_REORDER = /* Create temporary tables */ - "CREATE TEMPORARY TABLE queue_tmp" + "CREATE TEMPORARY TABLE queue_tmp IF NOT EXISTS" " ( position INTEGER PRIMARY KEY AUTOINCREMENT CHECK(position > 0)" " , kara_id INTEGER" " , priority INTEGER NOT NULL DEFAULT 1 CHECK(priority > 0 AND priority < 6)" @@ -146,7 +148,7 @@ __queue_reorder(volatile sqlite3 *db) " SELECT position + " CURRENT_POS_OR_0 ", kara_id, priority" " FROM queue_tmp;" /* Drop temporary tables */ - "DROP TABLE queue_tmp;" + "DELETE FROM queue_tmp;" "DELETE FROM sqlite_sequence WHERE name = 'queue_tmp';"; #undef CURRENT_POS_OR_0 SQLITE_EXEC(db, SQL_REORDER, error); @@ -274,7 +276,7 @@ database_queue_add_uri(volatile sqlite3 *db, struct lkt_uri *uri, int prio) case uri_author: return queue_add_with_col_like_str(db, LKT_DB_AUTHOR, uri->value, prio); case uri_playlist: - return database_queue_add_plt(db, (char *) uri->value, prio); + return database_queue_add_plt(db, uri->value, prio); default: LOG_WARN("DB", "Add to queue for uri of type %d is not" " implemented", uri->type); diff --git a/src/main/lkt.c b/src/main/lkt.c index 3999db0fd3f3a3ff3d08e2e6f397be5acbbe2372..9c53b2f685b0923251bbc09bb3455bb5b8b256e3 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -733,7 +733,17 @@ plt_add__(struct lkt_cmd_args *args) FILE *sock = lkt_connect(); fail_if(args->argc < 3, "Invalid argument, need at least three arguments: plt add <plt> <query>"); fail_if(!lkt_valid_type(args->argv[1]), "Invalid argument, type for the query is invalid"); - send_cmd_with_uri(sock, "playlistadd", args->argc, args->argv); + + int i; + char buf[LKT_MESSAGE_MAX] = {0}; + for (i = 2; i < args->argc - 1; ++i) { + strncat(buf, args->argv[i], LKT_MESSAGE_MAX - 1); + strncat(buf, " ", LKT_MESSAGE_MAX - 1); + } + strncat(buf, args->argv[i], LKT_MESSAGE_MAX - 1); + strncat(buf, "\n", LKT_MESSAGE_MAX - 1); + write_socket(sock, "playlistadd %s %s://%s", args->argv[0], args->argv[1], buf); + exit_with_status(sock, buff); } diff --git a/src/uri.c b/src/uri.c index eaf64887a11c1a402e42baec6da808fee1191add..fd46447148178714dac4a0864d0adabcd8fd6c6a 100644 --- a/src/uri.c +++ b/src/uri.c @@ -29,7 +29,7 @@ __prefix(char *str, struct lkt_uri *ret) } else if (STR_NMATCH(str, "playlist", 8)) { ret->column_name = NULL; ret->type = uri_playlist; - val = str + 3; + val = str + 8; } else if (STR_NMATCH(str, "type", 4)) { ret->column_name = LKT_DB_TYPE; ret->type = uri_type;