From 13458e53b36eecc2f5cb5e520b26ba6dcc5abc06 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Thu, 9 Apr 2020 23:34:22 +0200
Subject: [PATCH] WIP: First step with macros

---
 inc/lektor/macro.h   | 20 ++++++++++
 src/database/queue.c | 89 +++++++++-----------------------------------
 src/main/lktadm.c    |  8 ++--
 3 files changed, 42 insertions(+), 75 deletions(-)
 create mode 100644 inc/lektor/macro.h

diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h
new file mode 100644
index 00000000..65447285
--- /dev/null
+++ b/inc/lektor/macro.h
@@ -0,0 +1,20 @@
+#pragma once
+
+#ifndef __FUNCTION__
+#define __FUNCTION__ __func__
+#endif /* __FUNCTION__ */
+
+#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", \
+                __FUNCTION__, sqlite3_errmsg(db));                  \
+        goto goto_label;                                            \
+    }
+
+#ifndef MAX
+#define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif /* MAX */
+
+#ifndef MIN
+#define MIN(a, b) ((a) > (b) ? (b) : (a))
+#endif /* MIN */
diff --git a/src/database/queue.c b/src/database/queue.c
index 1c807daf..c45973de 100644
--- a/src/database/queue.c
+++ b/src/database/queue.c
@@ -1,11 +1,12 @@
+#define _POSIX_C_SOURCE 200809L
+
 #include <lektor/database.h>
+#include <lektor/macro.h>
 
 #include <linux/limits.h>
 #include <stdio.h>
 #include <string.h>
 
-#define max(a, b) ((a) < (b) ? (b) : (a))
-
 /* Find in in database/open.c */
 extern int is_sql_str_invalid(const char *);
 
@@ -20,11 +21,7 @@ database_queue_state(sqlite3 *db, struct lkt_queue_state *res)
     sqlite3_stmt *stmt = 0;
     bool ret = false;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_state: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
 
     if (sqlite3_step(stmt) != SQLITE_ROW) {
         fprintf(stderr, " ! database_queue_state: queue_state has no row.\n");
@@ -66,12 +63,7 @@ database_queue_current_kara(sqlite3 *db, struct kara_metadata *res)
     sqlite3_stmt *stmt = 0;
     int code = -1;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_current_kara: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
-
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
     memset(res, 0, sizeof(struct kara_metadata));
     code = sqlite3_step(stmt);
 
@@ -116,12 +108,7 @@ queue_add_with_col_like_str(sqlite3 *db, const char *col, const char *val, int p
     sqlite3_stmt *stmt = NULL;
 
     snprintf(SQL, 1024, SQL_STMT, col);
-
-    if (sqlite3_prepare_v2(db, SQL, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! queue_add_with_col_like_str: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    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) {
@@ -178,12 +165,7 @@ queue_insert_with_col_like_str(sqlite3 *db, const char *col, const char *val, in
     sqlite3_stmt *stmt = NULL;
 
     snprintf(SQL, 1024, SQL_STMT, col);
-
-    if (sqlite3_prepare_v2(db, SQL, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! queue_insert_with_col_like_str: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    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) {
@@ -230,11 +212,7 @@ database_queue_add_plt(sqlite3 *db, const char *plt_name, int priority)
     bool status = false;
     sqlite3_stmt *stmt = NULL;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_add_plt: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    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) {
@@ -328,8 +306,7 @@ database_queue_add_id(sqlite3 *db, int id, int priority)
     bool status = false;
     sqlite3_stmt *stmt = NULL;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK)
-        goto error;
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
 
     if (sqlite3_bind_int(stmt, 1, id) != SQLITE_OK ||
         sqlite3_bind_int(stmt, 2, priority) != SQLITE_OK)
@@ -399,16 +376,12 @@ database_queue_next(sqlite3 *db, char filepath[PATH_MAX])
     int code = SQLITE_OK, id;
     sqlite3_stmt *stmt = NULL;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_next: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
 
     code = sqlite3_step(stmt);
 
     if (code == SQLITE_ROW) {
-        id = max(1, sqlite3_column_int(stmt, 1));
+        id = MAX(1, sqlite3_column_int(stmt, 1));
         snprintf(SQL_UPDATE, PATH_MAX, "UPDATE queue_state SET current = %d;", id);
 
         if (filepath != NULL)
@@ -473,16 +446,11 @@ database_queue_prev(sqlite3 *db, char filepath[PATH_MAX])
     int code = SQLITE_OK, id;
     sqlite3_stmt *stmt = NULL;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_prev: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
-
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
     code = sqlite3_step(stmt);
 
     if (code == SQLITE_ROW) {
-        id = max(1, sqlite3_column_int(stmt, 1));
+        id = MAX(1, sqlite3_column_int(stmt, 1));
         snprintf(SQL_UPDATE, PATH_MAX, "UPDATE queue_state SET current = %d;", id);
 
         if (filepath != NULL)
@@ -566,11 +534,7 @@ database_queue_move(sqlite3 *db, int from, int to)
     bool ret = false;
     int code;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_move: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
 
     if (sqlite3_bind_int(stmt, 1, to) != SQLITE_OK ||
         sqlite3_bind_int(stmt, 2, to) != SQLITE_OK ||
@@ -603,11 +567,7 @@ database_queue_play(sqlite3 *db, int pos)
     bool ret = false;
     sqlite3_stmt *stmt = NULL;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_play: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    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",
@@ -683,12 +643,7 @@ database_queue_get_current_file(sqlite3 *db, char filepath[PATH_MAX])
     if (filepath == NULL)
         goto error;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_get_current_file: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
-
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
     code = sqlite3_step(stmt);
 
     if (code == SQLITE_ROW)
@@ -804,11 +759,7 @@ database_queue_list_abs(sqlite3 *db, unsigned int from, unsigned int to, void *a
     bool ret = false;
     sqlite3_stmt *stmt;
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_list: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
 
     if (sqlite3_bind_int(stmt, 1, from) != SQLITE_OK
         || sqlite3_bind_int(stmt, 2, to) != SQLITE_OK) {
@@ -866,11 +817,7 @@ database_queue_list_from(sqlite3 *db, unsigned int count, void *args,
 
     snprintf(SQL_STMT, stmt_len, SQL_TEMPLATE, count);
 
-    if (sqlite3_prepare_v2(db, SQL_STMT, -1, &stmt, 0) != SQLITE_OK) {
-        fprintf(stderr, " ! database_queue_list: Failed to prepare statement: %s\n",
-                sqlite3_errmsg(db));
-        goto error;
-    }
+    SQLITE_PREPARE(db, stmt, SQL_STMT, error);
 
     for (;;) {
         code = sqlite3_step(stmt);
diff --git a/src/main/lktadm.c b/src/main/lktadm.c
index 59681e77..17ea343b 100644
--- a/src/main/lktadm.c
+++ b/src/main/lktadm.c
@@ -80,10 +80,10 @@ main(int argc, char *argv[])
             goto end_populate;
         }
 
-    if (!database_open(db, db_path)) {
-        fprintf(stderr, " ! lkt_listen: Failed to open database\n");
-        return 1;
-    }
+        if (!database_open(db, db_path)) {
+            fprintf(stderr, " ! lkt_listen: Failed to open database\n");
+            return 1;
+        }
 
         database_update(db, kara_dir);
         sqlite3_close(db);
-- 
GitLab