20std::vector<std::string>
21loadStatementDraftTransactionIds(sqlite3* db,
22 const std::string& statementDraftId) {
23 std::vector<std::string> ids;
24 if (!db || statementDraftId.empty()) {
29 db,
"SELECT transaction_draft_id FROM statement_draft_transactions WHERE "
30 "statement_draft_id = ? ORDER BY position, transaction_draft_id;");
35 stmt.bindText(1, statementDraftId);
36 while (stmt.step() == SQLITE_ROW) {
37 ids.push_back(stmt.columnText(0));
42void saveStatementDraftTransactionIds(
43 sqlite3* db,
const std::string& statementDraftId,
44 const std::vector<std::string>& transactionIds) {
45 if (!db || statementDraftId.empty()) {
51 "DELETE FROM statement_draft_transactions WHERE statement_draft_id = ?;");
55 deleteStmt.bindText(1, statementDraftId);
60 "INSERT OR IGNORE INTO statement_draft_transactions (statement_draft_id, "
61 "transaction_draft_id, position) VALUES (?, ?, ?);");
66 for (std::size_t i = 0; i < transactionIds.size(); ++i) {
67 if (transactionIds[i].empty()) {
71 insertStmt.bindText(1, statementDraftId);
72 insertStmt.bindText(2, transactionIds[i]);
73 insertStmt.bindInt(3,
static_cast<int>(i));
78void writeStatementDraft(
80 const std::shared_ptr<core::application::importing::draft::StatementDraft>&
87 if (draft->id.empty()) {
96 stmt.bindText(1, draft->id);
97 stmt.bindText(2, draft->name);
98 stmt.bindText(3, draft->createdAt);
99 stmt.bindText(4, draft->updatedAt);
106 explicit Impl(std::shared_ptr<SqliteDb>
db) :
db(std::move(
db)) {}
108 std::shared_ptr<SqliteDb>
db;
112 const std::string& dbPath)
116 std::shared_ptr<SqliteDb> db)
117 : pimpl_(std::make_unique<
Impl>(std::move(db))) {
119 throw std::runtime_error(
"db is null");
126 const std::shared_ptr<core::application::importing::draft::StatementDraft>&
128 const auto db = pimpl_->db->handle();
129 writeStatementDraft(db, draft,
130 "INSERT INTO statement_drafts (id, name, created_at, "
131 "updated_at) VALUES (?, ?, ?, ?);");
133 saveStatementDraftTransactionIds(db, draft->id, draft->transactionIds);
138 std::shared_ptr<core::application::importing::draft::StatementDraft>>
141 std::shared_ptr<core::application::importing::draft::StatementDraft>>
144 "SELECT id, name, created_at, updated_at FROM "
145 "statement_drafts ORDER BY id;");
150 while (stmt.
step() == SQLITE_ROW) {
152 std::make_shared<core::application::importing::draft::StatementDraft>();
157 draft->transactionIds =
158 loadStatementDraftTransactionIds(pimpl_->db->handle(), draft->id);
159 drafts.push_back(std::move(draft));
166 std::shared_ptr<core::application::importing::draft::StatementDraft>>
168 const std::string&
id)
const {
170 "SELECT id, name, created_at, updated_at FROM "
171 "statement_drafts WHERE id = ? LIMIT 1;");
177 if (stmt.
step() != SQLITE_ROW) {
182 std::make_shared<core::application::importing::draft::StatementDraft>();
187 draft->transactionIds =
188 loadStatementDraftTransactionIds(pimpl_->db->handle(), draft->id);
193 const std::string&
id) {
195 "DELETE FROM statement_drafts WHERE id = ?;");
204 const std::shared_ptr<core::application::importing::draft::StatementDraft>&
206 const auto db = pimpl_->db->handle();
207 writeStatementDraft(db, draft,
208 "UPDATE statement_drafts SET name = ?2, created_at = ?3, "
209 "updated_at = ?4 WHERE id = ?1;");
211 saveStatementDraftTransactionIds(db, draft->id, draft->transactionIds);
216 const std::shared_ptr<core::application::importing::draft::StatementDraft>&
218 const auto db = pimpl_->db->handle();
219 writeStatementDraft(db, draft,
220 "INSERT OR REPLACE INTO statement_drafts (id, name, "
221 "created_at, updated_at) VALUES (?, ?, ?, ?);");
223 saveStatementDraftTransactionIds(db, draft->id, draft->transactionIds);
229 "DELETE FROM statement_drafts;");
Declares the lightweight SQLite connection wrapper.
Declares the SQLite-backed statement draft repository.
Draft statement model used by import finalization and core application flow.
RAII wrapper for sqlite3_stmt* that auto-finalizes on destruction.
void removeStatementDraft(const std::string &id) override
Remove a statement draft by identifier.
void addStatementDraft(const std::shared_ptr< core::application::importing::draft::StatementDraft > &draft) override
Insert a new statement draft.
void upsertStatementDraft(const std::shared_ptr< core::application::importing::draft::StatementDraft > &draft) override
Insert or update a statement draft.
SqliteStatementDraftRepository(const std::string &dbPath)
Create a statement draft repository for the database at the given path.
std::optional< std::shared_ptr< core::application::importing::draft::StatementDraft > > getStatementDraftById(const std::string &id) const override
Retrieve a statement draft by identifier.
void updateStatementDraft(const std::shared_ptr< core::application::importing::draft::StatementDraft > &draft) override
Update an existing statement draft.
std::vector< std::shared_ptr< core::application::importing::draft::StatementDraft > > getStatementDrafts() const override
Retrieve all statement drafts.
~SqliteStatementDraftRepository() override
Destroy the repository.
void clearStatementDrafts() override
Remove all statement drafts.
std::string columnText(int col) const noexcept
void bindText(int col, const std::string &v) noexcept
std::string generateUuid()
std::shared_ptr< SqliteDb > db
Impl(std::shared_ptr< SqliteDb > db)