diff --git a/inc/common/macro.h b/inc/common/macro.h index ff1accded7f4f0f320713404dd4a457b2d10e226..5fa3a11342add3c059335e351af3c138e4e75578 100644 --- a/inc/common/macro.h +++ b/inc/common/macro.h @@ -142,20 +142,20 @@ typedef volatile enum { goto goto_label; \ } -#define SQLITE_BIND_TEXT(db, stmt, pos, text, error) \ +#define SQLITE_BIND_TEXT(db, stmt, pos, text, error) { \ if (sqlite3_bind_text(stmt, pos, text, -1, 0) != SQLITE_OK) { \ LOG_ERROR("DB", "Failed to bind text %s at pos %d: %s", \ (const char *) text, pos, \ sqlite3_errmsg((sqlite3 *) db)); \ goto error; \ - } + }} -#define SQLITE_BIND_INT(db, stmt, pos, integer, error) \ +#define SQLITE_BIND_INT(db, stmt, pos, integer, error) { \ if (sqlite3_bind_int(stmt, pos, integer) != SQLITE_OK) { \ LOG_ERROR("DB", "Failed to bind int %d at pos %d: %s", \ integer, pos, sqlite3_errmsg((sqlite3 *) db));\ goto error; \ - } + }} #define SQLITE_STEP(db, stmt, code, error) \ if (sqlite3_step(stmt) != code) { \ diff --git a/inc/lektor/uri.h b/inc/lektor/uri.h index 513091d46033659ff7a896d8ce2e7bca934efb29..f18e476272de2bdb261a678c198f09dbf0c0f3f5 100644 --- a/inc/lektor/uri.h +++ b/inc/lektor/uri.h @@ -22,6 +22,7 @@ struct lkt_uri { size_t id; }; bool _allocated; + bool is_int; }; /* Create and delete URIs */ diff --git a/src/database/find.c b/src/database/find.c index 7e2f5befe2b926367b3c40f0d5ab28fa538de4ab..4ec182a564105e5251696e5fdae7945616e1cd8d 100644 --- a/src/database/find.c +++ b/src/database/find.c @@ -31,7 +31,13 @@ database_search_database_init(volatile sqlite3 *db, struct lkt_search *ret) safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL_STMT_TEMPLATE, ret->ka_uri.column_name, ret->msg_count, ret->continuation); SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); - SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_uri.value, error); + if (!ret->ka_uri.is_int) { + SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_uri.value, error); + LOG_DEBUG("DB", "%s", "Uri was a text"); + } else { + SQLITE_BIND_INT(db, ret->stmt, 1, (int) ret->ka_uri.id, error); + LOG_DEBUG("DB", "%s", "Uri was a size_t"); + } ret->db = db; return true; error: @@ -60,7 +66,13 @@ database_search_playlist_init(volatile sqlite3 *db, struct lkt_search *ret) ret->ka_uri.column_name, ret->msg_count, ret->continuation); SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->plt_name, error); - SQLITE_BIND_TEXT(db, ret->stmt, 2, ret->ka_uri.value, error); + if (!ret->ka_uri.is_int) { + SQLITE_BIND_TEXT(db, ret->stmt, 2, ret->ka_uri.value, error); + LOG_DEBUG("DB", "%s", "Uri was a text"); + } else { + SQLITE_BIND_INT(db, ret->stmt, 2, (int) ret->ka_uri.id, error); + LOG_DEBUG("DB", "%s", "Uri was a size_t"); + } ret->db = db; return true; error: @@ -134,7 +146,13 @@ database_search_queue_init(volatile sqlite3 *db, struct lkt_search *ret) safe_snprintf(SQL_STMT, LKT_MAX_SQLITE_STATEMENT, SQL_STMT_TEMPLATE, ret->ka_uri.column_name, ret->msg_count, ret->continuation); SQLITE_PREPARE(db, ret->stmt, SQL_STMT, error); - SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_uri.value, error); + if (!ret->ka_uri.is_int) { + SQLITE_BIND_TEXT(db, ret->stmt, 1, ret->ka_uri.value, error); + LOG_DEBUG("DB", "%s", "Uri was a text"); + } else { + SQLITE_BIND_INT(db, ret->stmt, 1, (int) ret->ka_uri.id, error); + LOG_DEBUG("DB", "%s", "Uri was a size_t"); + } ret->db = db; return true; error: diff --git a/src/uri.c b/src/uri.c index 82364fc9eed7ba45aaf6318122fd34b9a17fc618..eaf64887a11c1a402e42baec6da808fee1191add 100644 --- a/src/uri.c +++ b/src/uri.c @@ -68,11 +68,14 @@ lkt_uri_from(struct lkt_uri *ret, char *const str) if (NULL == __prefix(str, ret)) return false; + ret->is_int = false; + if (ret->type == uri_id) { errno = 0; - ret->id = strtol(ret->value, NULL, 10); /* Override */ + ret->id = strtol(ret->value, NULL, 0); /* Override */ if (errno != 0) return false; + ret->is_int = true; } ret->_allocated = false;