mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-15 03:12:44 +02:00
wallet: refactor: dedup sqlite blob binding
This commit is contained in:
parent
4774b753bb
commit
8ea6167099
@ -37,6 +37,22 @@ static void ErrorLogCallback(void* arg, int code, const char* msg)
|
|||||||
LogPrintf("SQLite Error. Code: %d. Message: %s\n", code, msg);
|
LogPrintf("SQLite Error. Code: %d. Message: %s\n", code, msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool BindBlobToStatement(sqlite3_stmt* stmt,
|
||||||
|
int index,
|
||||||
|
Span<const std::byte> blob,
|
||||||
|
const std::string& description)
|
||||||
|
{
|
||||||
|
int res = sqlite3_bind_blob(stmt, index, blob.data(), blob.size(), SQLITE_STATIC);
|
||||||
|
if (res != SQLITE_OK) {
|
||||||
|
LogPrintf("Unable to bind %s to statement: %s\n", description, sqlite3_errstr(res));
|
||||||
|
sqlite3_clear_bindings(stmt);
|
||||||
|
sqlite3_reset(stmt);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static std::optional<int> ReadPragmaInteger(sqlite3* db, const std::string& key, const std::string& description, bilingual_str& error)
|
static std::optional<int> ReadPragmaInteger(sqlite3* db, const std::string& key, const std::string& description, bilingual_str& error)
|
||||||
{
|
{
|
||||||
std::string stmt_text = strprintf("PRAGMA %s", key);
|
std::string stmt_text = strprintf("PRAGMA %s", key);
|
||||||
@ -377,14 +393,8 @@ bool SQLiteBatch::ReadKey(CDataStream&& key, CDataStream& value)
|
|||||||
assert(m_read_stmt);
|
assert(m_read_stmt);
|
||||||
|
|
||||||
// Bind: leftmost parameter in statement is index 1
|
// Bind: leftmost parameter in statement is index 1
|
||||||
int res = sqlite3_bind_blob(m_read_stmt, 1, key.data(), key.size(), SQLITE_STATIC);
|
if (!BindBlobToStatement(m_read_stmt, 1, key, "key")) return false;
|
||||||
if (res != SQLITE_OK) {
|
int res = sqlite3_step(m_read_stmt);
|
||||||
LogPrintf("%s: Unable to bind statement: %s\n", __func__, sqlite3_errstr(res));
|
|
||||||
sqlite3_clear_bindings(m_read_stmt);
|
|
||||||
sqlite3_reset(m_read_stmt);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
res = sqlite3_step(m_read_stmt);
|
|
||||||
if (res != SQLITE_ROW) {
|
if (res != SQLITE_ROW) {
|
||||||
if (res != SQLITE_DONE) {
|
if (res != SQLITE_DONE) {
|
||||||
// SQLITE_DONE means "not found", don't log an error in that case.
|
// SQLITE_DONE means "not found", don't log an error in that case.
|
||||||
@ -418,23 +428,11 @@ bool SQLiteBatch::WriteKey(CDataStream&& key, CDataStream&& value, bool overwrit
|
|||||||
|
|
||||||
// Bind: leftmost parameter in statement is index 1
|
// Bind: leftmost parameter in statement is index 1
|
||||||
// Insert index 1 is key, 2 is value
|
// Insert index 1 is key, 2 is value
|
||||||
int res = sqlite3_bind_blob(stmt, 1, key.data(), key.size(), SQLITE_STATIC);
|
if (!BindBlobToStatement(stmt, 1, key, "key")) return false;
|
||||||
if (res != SQLITE_OK) {
|
if (!BindBlobToStatement(stmt, 2, value, "value")) return false;
|
||||||
LogPrintf("%s: Unable to bind key to statement: %s\n", __func__, sqlite3_errstr(res));
|
|
||||||
sqlite3_clear_bindings(stmt);
|
|
||||||
sqlite3_reset(stmt);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
res = sqlite3_bind_blob(stmt, 2, value.data(), value.size(), SQLITE_STATIC);
|
|
||||||
if (res != SQLITE_OK) {
|
|
||||||
LogPrintf("%s: Unable to bind value to statement: %s\n", __func__, sqlite3_errstr(res));
|
|
||||||
sqlite3_clear_bindings(stmt);
|
|
||||||
sqlite3_reset(stmt);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
res = sqlite3_step(stmt);
|
int res = sqlite3_step(stmt);
|
||||||
sqlite3_clear_bindings(stmt);
|
sqlite3_clear_bindings(stmt);
|
||||||
sqlite3_reset(stmt);
|
sqlite3_reset(stmt);
|
||||||
if (res != SQLITE_DONE) {
|
if (res != SQLITE_DONE) {
|
||||||
@ -449,16 +447,10 @@ bool SQLiteBatch::EraseKey(CDataStream&& key)
|
|||||||
assert(m_delete_stmt);
|
assert(m_delete_stmt);
|
||||||
|
|
||||||
// Bind: leftmost parameter in statement is index 1
|
// Bind: leftmost parameter in statement is index 1
|
||||||
int res = sqlite3_bind_blob(m_delete_stmt, 1, key.data(), key.size(), SQLITE_STATIC);
|
if (!BindBlobToStatement(m_delete_stmt, 1, key, "key")) return false;
|
||||||
if (res != SQLITE_OK) {
|
|
||||||
LogPrintf("%s: Unable to bind statement: %s\n", __func__, sqlite3_errstr(res));
|
|
||||||
sqlite3_clear_bindings(m_delete_stmt);
|
|
||||||
sqlite3_reset(m_delete_stmt);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
res = sqlite3_step(m_delete_stmt);
|
int res = sqlite3_step(m_delete_stmt);
|
||||||
sqlite3_clear_bindings(m_delete_stmt);
|
sqlite3_clear_bindings(m_delete_stmt);
|
||||||
sqlite3_reset(m_delete_stmt);
|
sqlite3_reset(m_delete_stmt);
|
||||||
if (res != SQLITE_DONE) {
|
if (res != SQLITE_DONE) {
|
||||||
@ -473,18 +465,11 @@ bool SQLiteBatch::HasKey(CDataStream&& key)
|
|||||||
assert(m_read_stmt);
|
assert(m_read_stmt);
|
||||||
|
|
||||||
// Bind: leftmost parameter in statement is index 1
|
// Bind: leftmost parameter in statement is index 1
|
||||||
bool ret = false;
|
if (!BindBlobToStatement(m_read_stmt, 1, key, "key")) return false;
|
||||||
int res = sqlite3_bind_blob(m_read_stmt, 1, key.data(), key.size(), SQLITE_STATIC);
|
int res = sqlite3_step(m_read_stmt);
|
||||||
if (res == SQLITE_OK) {
|
|
||||||
res = sqlite3_step(m_read_stmt);
|
|
||||||
if (res == SQLITE_ROW) {
|
|
||||||
ret = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sqlite3_clear_bindings(m_read_stmt);
|
sqlite3_clear_bindings(m_read_stmt);
|
||||||
sqlite3_reset(m_read_stmt);
|
sqlite3_reset(m_read_stmt);
|
||||||
return ret;
|
return res == SQLITE_ROW;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SQLiteBatch::StartCursor()
|
bool SQLiteBatch::StartCursor()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user