From 71ece564702a5d91d72f5d35fe34fe5cf9f18556 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Fri, 12 Dec 2014 22:04:43 +0100 Subject: sticker/Database: move code to BindFind() --- src/lib/sqlite/Util.hxx | 13 +++++++++++++ src/sticker/StickerDatabase.cxx | 24 ++++++++++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/lib/sqlite/Util.hxx b/src/lib/sqlite/Util.hxx index abc35835b..da74d1c3c 100644 --- a/src/lib/sqlite/Util.hxx +++ b/src/lib/sqlite/Util.hxx @@ -80,6 +80,19 @@ BindAll(Error &error, sqlite3_stmt *stmt, Args&&... args) return BindAll2(error, stmt, 1, std::forward(args)...); } +/** + * Wrapper for BindAll() that returns the specified sqlite3_stmt* on + * success and nullptr on error. + */ +template +static sqlite3_stmt * +BindAllOrNull(Error &error, sqlite3_stmt *stmt, Args&&... args) +{ + return BindAll(error, stmt, std::forward(args)...) + ? stmt + : nullptr; +} + /** * Call sqlite3_stmt() repepatedly until something other than * SQLITE_BUSY is returned. diff --git a/src/sticker/StickerDatabase.cxx b/src/sticker/StickerDatabase.cxx index 70f47d163..e1e5d76ab 100644 --- a/src/sticker/StickerDatabase.cxx +++ b/src/sticker/StickerDatabase.cxx @@ -368,6 +368,20 @@ sticker_load(const char *type, const char *uri, Error &error) return new sticker(std::move(s)); } +static sqlite3_stmt * +BindFind(const char *type, const char *base_uri, const char *name, + Error &error) +{ + assert(type != nullptr); + assert(name != nullptr); + + if (base_uri == nullptr) + base_uri = ""; + + return BindAllOrNull(error, sticker_stmt[STICKER_SQL_FIND], + type, base_uri, name); +} + bool sticker_find(const char *type, const char *base_uri, const char *name, void (*func)(const char *uri, const char *value, @@ -375,17 +389,11 @@ sticker_find(const char *type, const char *base_uri, const char *name, void *user_data, Error &error) { - sqlite3_stmt *const stmt = sticker_stmt[STICKER_SQL_FIND]; - - assert(type != nullptr); - assert(name != nullptr); assert(func != nullptr); assert(sticker_enabled()); - if (base_uri == nullptr) - base_uri = ""; - - if (!BindAll(error, stmt, type, base_uri, name)) + sqlite3_stmt *const stmt = BindFind(type, base_uri, name, error); + if (stmt == nullptr) return false; const bool success = ExecuteForEach(stmt, error, -- cgit v1.2.3