aboutsummaryrefslogtreecommitdiff
path: root/signature_db.cpp
diff options
context:
space:
mode:
authorGravatar Chris Xiong <chirs241097@gmail.com> 2022-09-18 00:00:07 -0400
committerGravatar Chris Xiong <chirs241097@gmail.com> 2022-09-18 00:00:07 -0400
commitf02cb7bf4978ec0fa1eea4ed0b21460b7637d741 (patch)
tree91d28f7ca46c6fe7cfd41efd63fa2e2fc2b59221 /signature_db.cpp
parent04f509fd948c03c8b8732ddb6787eea800bdc7f6 (diff)
downloaddeduper-f02cb7bf4978ec0fa1eea4ed0b21460b7637d741.tar.xz
Add batching for get_signature().
Diffstat (limited to 'signature_db.cpp')
-rw-r--r--signature_db.cpp28
1 files changed, 24 insertions, 4 deletions
diff --git a/signature_db.cpp b/signature_db.cpp
index 429581d..393b756 100644
--- a/signature_db.cpp
+++ b/signature_db.cpp
@@ -14,6 +14,7 @@ const int SIGDB_VERSION = 3;
enum batch_status
{
none = 0,
+ getsig,
putsub,
findsub,
setpar,
@@ -169,11 +170,20 @@ size_t signature_db::put_signature(const fs::path &path, const signature &sig,si
return static_cast<size_t>(sqlite3_last_insert_rowid(p->db));
}
+void signature_db::batch_get_signature_begin()
+{
+ if (!p->db) [[ unlikely ]] return;
+ sqlite3_prepare_v2(p->db, "select path, signature from images where id = ?;", -1, &p->bst[batch_status::getsig], 0);
+}
+
std::pair<fs::path, signature> signature_db::get_signature(size_t id)
{
if (!p->db) [[ unlikely ]] return std::make_pair(fs::path(), signature());
- sqlite3_stmt *st;
- sqlite3_prepare_v2(p->db, "select path, signature from images where id = ?;", -1, &st, 0);
+ sqlite3_stmt *st = nullptr;
+ if (p->bst[batch_status::getsig])
+ st = p->bst[batch_status::getsig];
+ else
+ sqlite3_prepare_v2(p->db, "select path, signature from images where id = ?;", -1, &st, 0);
sqlite3_bind_int(st, 1, id);
int rr = sqlite3_step(st);
if (rr == SQLITE_ROW)
@@ -184,15 +194,25 @@ std::pair<fs::path, signature> signature_db::get_signature(size_t id)
fs::path path((char*)sqlite3_column_text(st, 0));
#endif
std::string sigs((char*)sqlite3_column_text(st, 1));
- sqlite3_finalize(st);
+ if (p->bst[batch_status::getsig])
+ sqlite3_reset(st);
+ else
+ sqlite3_finalize(st);
return std::make_pair(path, signature::from_string(std::move(sigs)));
}
else
{
- sqlite3_finalize(st);
+ if (p->bst[batch_status::getsig])
+ sqlite3_reset(st);
+ else
+ sqlite3_finalize(st);
return std::make_pair(fs::path(), signature());
}
}
+void signature_db::batch_get_signature_end()
+{
+ p->batch_end(batch_status::getsig);
+}
void signature_db::batch_put_subslice_begin()
{