Commit 71ece564 authored by Max Kellermann's avatar Max Kellermann

sticker/Database: move code to BindFind()

parent 204a1de3
......@@ -81,6 +81,19 @@ BindAll(Error &error, sqlite3_stmt *stmt, Args&&... args)
}
/**
* Wrapper for BindAll() that returns the specified sqlite3_stmt* on
* success and nullptr on error.
*/
template<typename... Args>
static sqlite3_stmt *
BindAllOrNull(Error &error, sqlite3_stmt *stmt, Args&&... args)
{
return BindAll(error, stmt, std::forward<Args>(args)...)
? stmt
: nullptr;
}
/**
* Call sqlite3_stmt() repepatedly until something other than
* SQLITE_BUSY is returned.
*/
......
......@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment