From be9de8b2e0864b46498496af9ffdc31c0e7b764a Mon Sep 17 00:00:00 2001
|
|
From: Daniel Kamil Kozar <dkk089@gmail.com>
|
|
Date: Sun, 16 Dec 2018 14:21:58 +0100
|
|
Subject: [PATCH] Reduce duplication in sql.c
|
|
|
|
---
|
|
sql.c | 166 ++++++++++++++++++++--------------------------------------
|
|
1 file changed, 58 insertions(+), 108 deletions(-)
|
|
|
|
--- a/sql.c
|
|
+++ b/sql.c
|
|
@@ -65,122 +65,72 @@ sql_get_table(sqlite3 *db, const char *s
|
|
return ret;
|
|
}
|
|
|
|
+#define sql_get_field(type, column_get_fn) \
|
|
+ va_list ap;\
|
|
+ int counter, result;\
|
|
+ char *sql;\
|
|
+ type ret;\
|
|
+ sqlite3_stmt *stmt;\
|
|
+ \
|
|
+ va_start(ap, fmt);\
|
|
+ sql = sqlite3_vmprintf(fmt, ap);\
|
|
+ va_end(ap);\
|
|
+\
|
|
+ /*DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql); */ \
|
|
+\
|
|
+ switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))\
|
|
+ {\
|
|
+ case SQLITE_OK:\
|
|
+ break;\
|
|
+ default:\
|
|
+ DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql);\
|
|
+ sqlite3_free(sql);\
|
|
+ return -1;\
|
|
+ }\
|
|
+\
|
|
+ for (counter = 0;\
|
|
+ ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;\
|
|
+ counter++) {\
|
|
+ /* While SQLITE_BUSY has a built in timeout,\
|
|
+ * SQLITE_LOCKED does not, so sleep */\
|
|
+ if (result == SQLITE_LOCKED)\
|
|
+ sleep(1);\
|
|
+ }\
|
|
+\
|
|
+ switch (result)\
|
|
+ {\
|
|
+ case SQLITE_DONE:\
|
|
+ /* no rows returned */\
|
|
+ ret = 0;\
|
|
+ break;\
|
|
+ case SQLITE_ROW:\
|
|
+ if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)\
|
|
+ {\
|
|
+ ret = 0;\
|
|
+ break;\
|
|
+ }\
|
|
+ ret = column_get_fn(stmt, 0);\
|
|
+ break;\
|
|
+ default:\
|
|
+ DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql);\
|
|
+ ret = -1;\
|
|
+ break;\
|
|
+ }\
|
|
+ sqlite3_free(sql);\
|
|
+ sqlite3_finalize(stmt);\
|
|
+\
|
|
+ return ret;
|
|
+
|
|
int
|
|
sql_get_int_field(sqlite3 *db, const char *fmt, ...)
|
|
{
|
|
- va_list ap;
|
|
- int counter, result;
|
|
- char *sql;
|
|
- int ret;
|
|
- sqlite3_stmt *stmt;
|
|
-
|
|
- va_start(ap, fmt);
|
|
- sql = sqlite3_vmprintf(fmt, ap);
|
|
- va_end(ap);
|
|
-
|
|
- //DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql);
|
|
-
|
|
- switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))
|
|
- {
|
|
- case SQLITE_OK:
|
|
- break;
|
|
- default:
|
|
- DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql);
|
|
- sqlite3_free(sql);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- for (counter = 0;
|
|
- ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;
|
|
- counter++) {
|
|
- /* While SQLITE_BUSY has a built in timeout,
|
|
- * SQLITE_LOCKED does not, so sleep */
|
|
- if (result == SQLITE_LOCKED)
|
|
- sleep(1);
|
|
- }
|
|
-
|
|
- switch (result)
|
|
- {
|
|
- case SQLITE_DONE:
|
|
- /* no rows returned */
|
|
- ret = 0;
|
|
- break;
|
|
- case SQLITE_ROW:
|
|
- if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)
|
|
- {
|
|
- ret = 0;
|
|
- break;
|
|
- }
|
|
- ret = sqlite3_column_int(stmt, 0);
|
|
- break;
|
|
- default:
|
|
- DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql);
|
|
- ret = -1;
|
|
- break;
|
|
- }
|
|
- sqlite3_free(sql);
|
|
- sqlite3_finalize(stmt);
|
|
-
|
|
- return ret;
|
|
+ sql_get_field(int, sqlite3_column_int)
|
|
}
|
|
|
|
int64_t
|
|
sql_get_int64_field(sqlite3 *db, const char *fmt, ...)
|
|
{
|
|
- va_list ap;
|
|
- int counter, result;
|
|
- char *sql;
|
|
- int64_t ret;
|
|
- sqlite3_stmt *stmt;
|
|
-
|
|
- va_start(ap, fmt);
|
|
- sql = sqlite3_vmprintf(fmt, ap);
|
|
- va_end(ap);
|
|
-
|
|
- //DPRINTF(E_DEBUG, L_DB_SQL, "sql: %s\n", sql);
|
|
-
|
|
- switch (sqlite3_prepare_v2(db, sql, -1, &stmt, NULL))
|
|
- {
|
|
- case SQLITE_OK:
|
|
- break;
|
|
- default:
|
|
- DPRINTF(E_ERROR, L_DB_SQL, "prepare failed: %s\n%s\n", sqlite3_errmsg(db), sql);
|
|
- sqlite3_free(sql);
|
|
- return -1;
|
|
- }
|
|
-
|
|
- for (counter = 0;
|
|
- ((result = sqlite3_step(stmt)) == SQLITE_BUSY || result == SQLITE_LOCKED) && counter < 2;
|
|
- counter++) {
|
|
- /* While SQLITE_BUSY has a built in timeout,
|
|
- * SQLITE_LOCKED does not, so sleep */
|
|
- if (result == SQLITE_LOCKED)
|
|
- sleep(1);
|
|
- }
|
|
-
|
|
- switch (result)
|
|
- {
|
|
- case SQLITE_DONE:
|
|
- /* no rows returned */
|
|
- ret = 0;
|
|
- break;
|
|
- case SQLITE_ROW:
|
|
- if (sqlite3_column_type(stmt, 0) == SQLITE_NULL)
|
|
- {
|
|
- ret = 0;
|
|
- break;
|
|
- }
|
|
- ret = sqlite3_column_int64(stmt, 0);
|
|
- break;
|
|
- default:
|
|
- DPRINTF(E_WARN, L_DB_SQL, "%s: step failed: %s\n%s\n", __func__, sqlite3_errmsg(db), sql);
|
|
- ret = -1;
|
|
- break;
|
|
- }
|
|
- sqlite3_free(sql);
|
|
- sqlite3_finalize(stmt);
|
|
-
|
|
- return ret;
|
|
+ sql_get_field(int64_t, sqlite3_column_int64)
|
|
}
|
|
|
|
char *
|