diff --git a/src/database/find.c b/src/database/find.c index 92889c0de0be8330f54d3618b3289f6c425f6315..bcafb6ca3fa86b6af8173a2ed5a3ed42b71e7912 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -57,17 +57,17 @@ database_search_playlist_init(volatile sqlite3 *db, struct lkt_search *ret) " JOIN playlist ON playlist.id = playlist_id" " AND playlist.name COLLATE nocase = ?" " JOIN kara ON kara.id = kara_id" - " AND %s LIKE ?)" - "SELECT id, string, (SELECT MAX(len) FROM content)" + " AND %s LIKE ?) " + "SELECT id, string, (SELECT MAX(len) FROM content) " "FROM content LIMIT %d OFFSET %d;"; static const char *SQL = "WITH content AS (" - " SELECT kara.id AS id, string LENGTH(CAST(kara.id AS TEXT)) AS len" + " SELECT kara.id AS id, string, LENGTH(CAST(kara.id AS TEXT)) AS len" " FROM kara_playlist" " JOIN playlist ON playlist.id = playlist_id" " AND playlist.name COLLATE NOCASE = ?" - " JOIN kara ON kara.id = kara_id)" - "SELECT id, string (SELECT MAX(len) FROM content)" + " JOIN kara ON kara.id = kara_id) " + "SELECT id, string, (SELECT MAX(len) FROM content) " "FROM content LIMIT %d OFFSET %d;"; /* Common part */ @@ -78,6 +78,7 @@ database_search_playlist_init(volatile sqlite3 *db, struct lkt_search *ret) goto uri_is_null; /* Filter with an uri */ + LOG_INFO("DB", "List plt '%s' with non null uri", ret->plt_name); safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL_TEMPLATE, ret->ka_uri.column_name, ret->msg_count, ret->continuation); SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); @@ -93,6 +94,7 @@ database_search_playlist_init(volatile sqlite3 *db, struct lkt_search *ret) /* Don't filter */ uri_is_null: + LOG_INFO("DB", "List plt '%s' with null uri", ret->plt_name); safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL, ret->msg_count, ret->continuation); SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->plt_name, error); @@ -107,15 +109,17 @@ error: bool database_search_listplaylist_init(volatile sqlite3 *db, struct lkt_search *ret) { + bool code_ret = false; static const char *SQL = "SELECT name FROM playlist LIMIT %d OFFSET %d;"; char SQL_STMT[LKT_MAX_SQLITE_STATEMENT]; safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL, ret->msg_count, ret->continuation); ret->type = lkt_search_listplaylist; ret->db = db; SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); + code_ret = true; error: sqlite3_finalize(ret->stmt); - return false; + return code_ret; } bool diff --git a/src/database/open.c b/src/database/open.c index f82bbc7bef7ab111aaf349ae4400f4b6ae04a151..8a2701acdf4f1ffaf657375f6e89821986dd4f21 100644 --- a/src/database/open.c +++ b/src/database/open.c @@ -12,6 +12,12 @@ extern unsigned char ___src_database_disk_sql[]; extern unsigned char ___src_database_memory_sql[]; +static const char *__pragmas = + "PRAGMA case_sensitive_like = false;\n" + "PRAGMA encoding = 'UTF-8';\n" + "PRAGMA synchronous = 0;\n" + "PRAGMA journal_mode = off;\n"; + #define INVALID_CHARS_DBPATH ":?!'\"" #define HEAP_LIMIT_SOFT 100 * 1024 * 1024 #define HEAP_LIMIT_HARD 150 * 1024 * 1024 @@ -91,6 +97,7 @@ is_sql_str_invalid(const char *str) bool database_new(volatile sqlite3 **db) { + *db = NULL; static int flags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_SHAREDCACHE | SQLITE_OPEN_NOFOLLOW | @@ -101,10 +108,15 @@ database_new(volatile sqlite3 **db) SQLITE_OK != sqlite3_open_v2(":memory:", (sqlite3 **) db, flags, NULL)) return false; SQLITE_EXEC(*db, (const char *) ___src_database_memory_sql, err_not_init); + SQLITE_EXEC(*db, __pragmas, err_pragma); return true; err_not_init: *db = NULL; return false; +err_pragma: + sqlite3_close((sqlite3 *) *db); + *db = NULL; + return false; } static inline bool diff --git a/src/main/lkt.c b/src/main/lkt.c index f4ca94c64698d09dd8ddb6195ef6c1442bf418f9..ce715f6108672d1ff340f2539a6aa2595c8ff3c0 100644 --- a/src/main/lkt.c +++ b/src/main/lkt.c @@ -130,12 +130,12 @@ write_socket(FILE *sock, const char *format, ...) buff[LKT_MESSAGE_MAX - 1] = 0; if (size < 0) - fail("Connexion error") + fail("Connexion error"); - if (fwrite(buff, sizeof(char), size, sock) < (unsigned int) size) - fail("Connexion error") + if (fwrite(buff, sizeof(char), size, sock) < (unsigned int) size) + fail("Connexion error"); - va_end(ap); + va_end(ap); } noreturn static inline void @@ -851,15 +851,17 @@ redo: noreturn void list_plt__(struct lkt_cmd_args *args) { - fail_if(args->argc != 1, "Invalid argument number"); - __continuation_calls("listplaylist"); + fail_if(args->argc != 0, "Invalid argument number"); + __continuation_calls("listplaylists"); } noreturn void list_plt_content__(struct lkt_cmd_args *args) { - fail_if(args->argc != 0, "Invalid argument number"); - __continuation_calls("listplaylists"); + fail_if(args->argc != 1, "Invalid argument number"); + char buff[LKT_MESSAGE_MAX]; + safe_snprintf(buff, LKT_MESSAGE_MAX, "listplaylist %s", args->argv[0]); + __continuation_calls(buff); exit(EXIT_FAILURE); } @@ -988,6 +990,7 @@ static struct lkt_cmd_opt options_plt[] = { { .name = "delete", .call = plt_delete__ }, { .name = "destroy", .call = plt_destroy__ }, { .name = "create", .call = plt_create__ }, + { .name = "list", .call = search_plt__ }, LKT_OPT_NULL, };