diff --git a/inc/lektor/macro.h b/inc/lektor/macro.h
index 5cea0a50bd2172957af9beab44d3e069c59f4d14..c51ee07444f8ee40a81031bb5e1688f809100628 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 9dba758018efca89ae3a429041cd9b9783181e36..0b33b1517b43da01d74db8d6481fc8b5f62ccbe0 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 63e490b646dda30b620c2a1c535d5e55a62538b6..074229701f3f8f1c5a7ed6d62c3f444548c32023 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 5d70fae207aaedbf02a321ee7fdf132ff1e8143a..662e6aa704229dde7fbaf2f814cb03856baa6c3b 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 f29575b9c9a7d7ff3de28dd52eea5b39e859a10e..7750a1b9796afe75563bb9e0ed8f9cd268a41078 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 b6b61ec9e3b81e4ec872638a8476666f0d7666df..cf046b87260327bf240f98f29eff36f9e1c18f8c 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 6d5399ab66a028dc9f57b2a2c7c82f42aa4cc36a..c7bf11ecfb67a3feca5fac056757a9c57670c2f0 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",