From e2f31a06f996c3cf899a68055615d8b30f051c8d Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Wed, 8 Jul 2020 18:40:45 +0200
Subject: [PATCH] List content of a playlist

---
 src/database/find.c | 16 ++++++++++------
 src/database/open.c | 12 ++++++++++++
 src/main/lkt.c      | 19 +++++++++++--------
 3 files changed, 33 insertions(+), 14 deletions(-)

diff --git a/src/database/find.c b/src/database/find.c
index 92889c0d..bcafb6ca 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 f82bbc7b..8a2701ac 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 f4ca94c6..ce715f61 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,
 };
 
-- 
GitLab