From 64fb1bb77b9d0330e2d579d32c126d928350c361 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Fri, 10 Apr 2020 11:24:28 +0200
Subject: [PATCH] Even less lines of code

---
 inc/lektor/macro.h      | 34 ++++++++++++++++-------
 src/database/config.c   | 42 +++++++----------------------
 src/database/find.c     | 10 +------
 src/database/open.c     |  7 +----
 src/database/playlist.c | 57 ++++++++-------------------------------
 src/database/queue.c    | 60 ++++++++++-------------------------------
 src/database/user.c     | 16 +++--------
 7 files changed, 64 insertions(+), 162 deletions(-)

diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h
index 5cea0a50..c51ee074 100644
--- a/inc/lektor/macro.h
+++ b/inc/lektor/macro.h
@@ -1,17 +1,31 @@
 #pragma once
 
-#define SQLITE_PREPARE(db, stmt, SQL, goto_label)                   \
-    if (sqlite3_prepare_v2(db, SQL, -1, &(stmt), 0) != SQLITE_OK) { \
-        fprintf(stderr, " ! %s: Failed to prepare statement: %s\n", \
-                __func__, sqlite3_errmsg(db));                      \
-        goto goto_label;                                            \
+#define SQLITE_PREPARE(db, stmt, SQL, goto_label)                       \
+    if (sqlite3_prepare_v2(db, SQL, -1, &(stmt), 0) != SQLITE_OK) {     \
+        fprintf(stderr, " ! %s: Failed to prepare statement: %s\n",     \
+                __func__, sqlite3_errmsg(db));                          \
+        goto goto_label;                                                \
     }
 
-#define SQLITE_EXEC(db, SQL, goto_label)                            \
-    if (sqlite3_exec(db, SQL, NULL, NULL, NULL) != SQLITE_OK) {     \
-        fprintf(stderr, " ! %s: Failed to exec statement: %s\n",    \
-                __func__, sqlite3_errmsg(db));                      \
-        goto goto_label;                                            \
+#define SQLITE_EXEC(db, SQL, goto_label)                                \
+    if (sqlite3_exec(db, SQL, NULL, NULL, NULL) != SQLITE_OK) {         \
+        fprintf(stderr, " ! %s: Failed to exec statement: %s\n",        \
+                __func__, sqlite3_errmsg(db));                          \
+        goto goto_label;                                                \
+    }
+
+#define SQLITE_BIND_TEXT(db, stmt, pos, text, error)                    \
+    if (sqlite3_bind_text(stmt, pos, text, -1, 0) != SQLITE_OK) {       \
+        fprintf(stderr, " ! %s: Failed to bind text %s at position"     \
+                "%d: %s\n", __func__, text, pos, sqlite3_errmsg(db));   \
+        goto error;                                                     \
+    }
+
+#define SQLITE_BIND_INT(db, stmt, pos, integer, error)                  \
+    if (sqlite3_bind_int(stmt, pos, integer) != SQLITE_OK) {            \
+        fprintf(stderr, " ! %s: Failed to bind int %d at position %d:"  \
+                "%s\n", __func__, integer, pos, sqlite3_errmsg(db));    \
+        goto error;                                                     \
     }
 
 #define LKT_MAX_SQLITE_STATEMENT    1024
diff --git a/src/database/config.c b/src/database/config.c
index 9dba7580..0b33b151 100644
--- a/src/database/config.c
+++ b/src/database/config.c
@@ -19,14 +19,9 @@ database_config_set(sqlite3 *db, const char *section, const char *key, const cha
     int code;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, section, -1, 0) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, key, -1, 0) != SQLITE_OK     ||
-        sqlite3_bind_text(stmt, 3, value, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_config_set: Failed to bind: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, section, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, key, error);
+    SQLITE_BIND_TEXT(db, stmt, 3, value, error);
 
     code = sqlite3_step(stmt);
 
@@ -54,13 +49,8 @@ database_config_get_text(sqlite3 *db, const char *section, const char *key, char
     char *row;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, section, -1, 0) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, key, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_config_get_text: Failed to bind: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, section, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, key, error);
 
     if (sqlite3_step(stmt) != SQLITE_ROW) {
         fprintf(stderr, " ! database_config_get_text: Failed to insert or replace: %s\n",
@@ -88,13 +78,8 @@ database_config_exists(sqlite3 *db, const char *section, const char *key)
     bool ret = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, section, -1, 0) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, key, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_config_exists: Failed to bind: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, section, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, key, error);
 
     if (sqlite3_step(stmt) != SQLITE_ROW) {
         fprintf(stderr, " ! database_config_exists: No rows: %s\n",
@@ -119,13 +104,8 @@ database_config_get_int(sqlite3 *db, const char *section, const char *key, int *
     bool ret = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, section, -1, 0) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, key, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_config_get_int: Failed to bind: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, section, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, key, error);
 
     if (sqlite3_step(stmt) != SQLITE_ROW) {
         fprintf(stderr, " ! database_config_get_int: Failed to insert or replace: %s\n",
@@ -157,9 +137,7 @@ database_config_queue(sqlite3 *db, const char *option, int value)
     snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TMP, option);
     SQL_STMT[LKT_MAX_SQLITE_STATEMENT - 1] = 0;
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_int(stmt, 1, value) != SQLITE_OK)
-        goto error;
+    SQLITE_BIND_INT(db, stmt, 1, value, error);
 
     code = sqlite3_step(stmt);
 
diff --git a/src/database/find.c b/src/database/find.c
index 63e490b6..07422970 100644
--- a/src/database/find.c
+++ b/src/database/find.c
@@ -15,8 +15,6 @@ database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret)
         return false;
     }
 
-    *ret = NULL;
-
     static const char *SQL_STMT_TEMPLATE =
         "SELECT "
         "  kara.id AS id, "
@@ -27,13 +25,7 @@ database_search_init(sqlite3 *db, char *col_name, char *rgx, sqlite3_stmt **ret)
     snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT_TEMPLATE, col_name);
     SQL_STMT[LKT_MAX_SQLITE_STATEMENT - 1] = 0;
     SQLITE_PREPARE(db, *ret, SQL_STMT, error);
-
-    if (sqlite3_bind_text(*ret, 1, rgx, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_search_init: Failed to bind regex on column %s: %s\n",
-                col_name, sqlite3_errmsg(db));
-        goto error;
-    }
-
+    SQLITE_BIND_TEXT(db, *ret, 1, rgx, error);
     return true;
 error:
     sqlite3_finalize(*ret);
diff --git a/src/database/open.c b/src/database/open.c
index 5d70fae2..662e6aa7 100644
--- a/src/database/open.c
+++ b/src/database/open.c
@@ -125,12 +125,7 @@ __is_attached(sqlite3 *db, const char *name)
     bool ret = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (SQLITE_OK != sqlite3_bind_text(stmt, 1, name, -1, 0)) {
-        fprintf(stderr, " . __is_attached: Failed to bind name: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, name, error);
 
     if (sqlite3_step(stmt) == SQLITE_ROW)
         ret = true;
diff --git a/src/database/playlist.c b/src/database/playlist.c
index f29575b9..7750a1b9 100644
--- a/src/database/playlist.c
+++ b/src/database/playlist.c
@@ -18,11 +18,7 @@ database_plt_create(sqlite3 *db, const char *name)
     bool sta = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, name, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_plt_create: failed to bind playlist name: %s\n", sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, name, error);
 
     if (sqlite3_step(stmt) != SQLITE_DONE) {
         fprintf(stderr, " ! database_plt_create: expected SQLITE_DONE in step: %s\n",
@@ -46,11 +42,7 @@ database_plt_remove(sqlite3 *db, const char *name)
     bool sta = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, name, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_plt_remove: failed to bind playlist name: %s\n", sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, name, error);
 
     if (sqlite3_step(stmt) != SQLITE_DONE) {
         fprintf(stderr, " ! database_plt_remove: expected SQLITE_DONE in step: %s\n",
@@ -73,12 +65,8 @@ database_plt_remove_pos(sqlite3 *db, const char *name, int pos)
     bool sta = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, name, -1, 0) != SQLITE_OK ||
-        sqlite3_bind_int(stmt, 2, pos) != SQLITE_OK) {
-        fprintf(stderr, " ! database_plt_remove_pos: failed to bind playlist name: %s\n", sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, name, error);
+    SQLITE_BIND_INT(db, stmt, 2, pos, error);
 
     if (sqlite3_step(stmt) != SQLITE_OK) {
         fprintf(stderr, " ! database_plt_remove_pos: expected SQLITE_DONE in step: %s\n",
@@ -101,11 +89,7 @@ database_plt_clear(sqlite3 *db, const char *name)
     bool sta = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, name, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_plt_clear: failed to bind playlist name: %s\n", sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, name, error);
 
     if (sqlite3_step(stmt) != SQLITE_OK) {
         fprintf(stderr, " ! database_plt_clear: expected SQLITE_DONE in step: %s\n",
@@ -128,12 +112,8 @@ database_plt_rename(sqlite3 *db, const char *old_name, const char *new_name)
     bool sta = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, new_name, -1, 0) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, old_name, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_plt_rename: failed to bind playlist name: %s\n", sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, new_name, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, old_name, error);
 
     if (sqlite3_step(stmt) != SQLITE_OK) {
         fprintf(stderr, " ! database_plt_rename: expected SQLITE_DONE in step: %s\n",
@@ -193,9 +173,7 @@ database_plt_import(sqlite3 *db, const char *name)
         "INSERT OR IGNORE INTO kara_playlist (kara_id, playlist_id)"
         " SELECT %s.content.kara_id, ( SELECT id FROM playlist WHERE name = %s LIMIT 1 )"
         " FROM %s.content;\n";
-    char SQL_STMT[LKT_MAX_SQLITE_STATEMENT];
-    int code, ret = false;
-    sqlite3_stmt *stmt;
+    char SQL_STMT[LKT_MAX_SQLITE_STATEMENT], ret = false;
 
     if (is_sql_str_invalid(name)) {
         fprintf(stderr, " . database_plt_import: Name of playlist '%s' is invalid\n",
@@ -211,18 +189,9 @@ database_plt_import(sqlite3 *db, const char *name)
 
     snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL_SCHEM, name, name, name);
     SQL_STMT[LKT_MAX_SQLITE_STATEMENT - 1] = 0;
-    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-    code = sqlite3_step(stmt);
-
-    if (code != SQLITE_DONE && code != SQLITE_OK) {
-        fprintf(stderr, " . database_plt_import: Failed to import database: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
-
+    SQLITE_EXEC(db, SQL_STMT, error);
     ret = true;
 error:
-    sqlite3_finalize(stmt);
     return ret;
 }
 
@@ -264,12 +233,8 @@ database_plt_add_uri(sqlite3 *db, const char *name, struct lkt_uri_t *uri)
     snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT - 1, SQL, column);
     SQL_STMT[LKT_MAX_SQLITE_STATEMENT - 1] = 0;
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, name, -1, 0) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, uri->value, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_plt_add_uri: failed to bind playlist name: %s\n", sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, name, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, (char *) uri->value, error);
 
     if (sqlite3_step(stmt) != SQLITE_DONE) {
         fprintf(stderr, " ! database_plt_add_uri: expected SQLITE_DONE in step: %s\n",
diff --git a/src/database/queue.c b/src/database/queue.c
index b6b61ec9..cf046b87 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -107,13 +107,8 @@ queue_add_with_col_like_str(sqlite3 *db, const char *col, const char *val, int p
     snprintf(SQL, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT, col);
     SQL[LKT_MAX_SQLITE_STATEMENT - 1] = 0;
     SQLITE_PREPARE(db, stmt, SQL, error);
-
-    if (sqlite3_bind_int(stmt, 1, priority) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, val, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! queue_add_with_col_like_str: Failed to bind text: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_INT(db, stmt, 1, priority, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, val, error);
 
     if (sqlite3_step(stmt) != SQLITE_DONE) {
         fprintf(stderr, " ! queue_add_with_col_like_str: Failed to insert: %s\n",
@@ -165,13 +160,8 @@ queue_insert_with_col_like_str(sqlite3 *db, const char *col, const char *val, in
     snprintf(SQL, LKT_MAX_SQLITE_STATEMENT - 1, SQL_STMT, col);
     SQL[LKT_MAX_SQLITE_STATEMENT - 1] = 0;
     SQLITE_PREPARE(db, stmt, SQL, error);
-
-    if (sqlite3_bind_int(stmt, 1, pos) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, val, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! queue_insert_with_col_like_str: Failed to bind text: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_INT(db, stmt, 1, pos, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, val, error);
 
     if (sqlite3_step(stmt) != SQLITE_DONE) {
         fprintf(stderr, " ! queue_insert_with_col_like_str: Failed to insert: %s\n",
@@ -212,13 +202,8 @@ database_queue_add_plt(sqlite3 *db, const char *plt_name, int priority)
     sqlite3_stmt *stmt = NULL;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_int(stmt, 1, priority) != SQLITE_OK ||
-        sqlite3_bind_text(stmt, 2, plt_name, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_add_plt: Failed to bind text: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_INT(db, stmt, 1, priority, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, plt_name, error);
 
     if (sqlite3_step(stmt) != SQLITE_DONE) {
         fprintf(stderr, " ! database_queue_add_plt: Failed to insert: %s\n",
@@ -306,10 +291,8 @@ database_queue_add_id(sqlite3 *db, int id, int priority)
     sqlite3_stmt *stmt = NULL;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_int(stmt, 1, id) != SQLITE_OK ||
-        sqlite3_bind_int(stmt, 2, priority) != SQLITE_OK)
-        goto error;
+    SQLITE_BIND_INT(db, stmt, 1, id, error);
+    SQLITE_BIND_INT(db, stmt, 2, priority, error);
 
     if (sqlite3_step(stmt) != SQLITE_DONE)
         goto error;
@@ -513,14 +496,9 @@ database_queue_move(sqlite3 *db, int from, int to)
     int code;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_int(stmt, 1, to) != SQLITE_OK ||
-        sqlite3_bind_int(stmt, 2, to) != SQLITE_OK ||
-        sqlite3_bind_int(stmt, 3, from) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_move: Failed to bind ints: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_INT(db, stmt, 1, to, error);
+    SQLITE_BIND_INT(db, stmt, 2, to, error);
+    SQLITE_BIND_INT(db, stmt, 3, from, error);
 
     code = sqlite3_step(stmt);
 
@@ -546,12 +524,7 @@ database_queue_play(sqlite3 *db, int pos)
     sqlite3_stmt *stmt = NULL;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_int(stmt, 1, pos) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_play: Failed to bind start position: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_INT(db, stmt, 1, pos, error);
 
     code = sqlite3_step(stmt);
 
@@ -723,13 +696,8 @@ database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *a
     sqlite3_stmt *stmt;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_int(stmt, 1, from) != SQLITE_OK
-        || sqlite3_bind_int(stmt, 2, to) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_list: Failed to bind argument: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_INT(db, stmt, 1, from, error);
+    SQLITE_BIND_INT(db, stmt, 2, to, error);
 
     for (;;) {
         code = sqlite3_step(stmt);
diff --git a/src/database/user.c b/src/database/user.c
index 6d5399ab..c7bf11ec 100644
--- a/src/database/user.c
+++ b/src/database/user.c
@@ -12,12 +12,7 @@ database_user_authentificate(sqlite3 *db, const char *password)
     bool ret = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, password, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_user_authentificate: Failed to bind password: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, password, error);
 
     if (sqlite3_step(stmt) != SQLITE_ROW) {
         fprintf(stderr, " ! database_user_authentificate: No user found\n");
@@ -41,13 +36,8 @@ database_user_add(sqlite3 *db, const char *username, const char *password)
     bool ret = false;
 
     SQLITE_PREPARE(db, stmt, SQL_STMT, error);
-
-    if (sqlite3_bind_text(stmt, 1, username, -1, 0) != SQLITE_OK &&
-        sqlite3_bind_text(stmt, 2, password, -1, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_user_add: Failed to bind : %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_BIND_TEXT(db, stmt, 1, username, error);
+    SQLITE_BIND_TEXT(db, stmt, 2, password, error);
 
     if (sqlite3_step(stmt) != SQLITE_OK) {
         fprintf(stderr, " ! database_user_add: Failed to add user %s: %s\n",
-- 
GitLab