diff --git a/src/database.cpp b/src/database.cpp index 6012ebe..6e9408f 100644 --- a/src/database.cpp +++ b/src/database.cpp @@ -107,3 +107,20 @@ double Database::cacheAccountValue(long long accountId, sqlite3 *db) { return value; throw std::runtime_error("Failed to set cashedValue for " + std::to_string(accountId)); } + +void Database::accountDescription(const std::string& account, const std::string& description, sqlite3 *db) { + sqlite3_stmt *stmt; + int rc = sqlite3_prepare_v2(db, "UPDATE account SET description = ? WHERE name = ?", -1, &stmt, nullptr); + + if (rc != SQLITE_OK) + throw std::runtime_error("Failed preparing accountDescription statement"); + + sqlite3_bind_text(stmt, 1, description.c_str(), -1, SQLITE_TRANSIENT); + sqlite3_bind_text(stmt, 2, account.c_str(), -1, SQLITE_TRANSIENT); + + rc = sqlite3_step(stmt); + sqlite3_finalize(stmt); + + if (rc != SQLITE_DONE) + throw std::runtime_error("Failed to set description on " + account); +} diff --git a/src/database.h b/src/database.h index a5a6c9b..9a71ed8 100644 --- a/src/database.h +++ b/src/database.h @@ -58,6 +58,17 @@ public: * @throws std::runtime_error If the database query fails */ static double cacheAccountValue(long long accountId, sqlite3 *db); + + /** + * @brief Sets a new description for an account + * + * @param account The account name + * @param description The new description + * @param db The database connection to use + * + * @throws std::runtime_error If the statement fails to prepare or the step fails to execute + */ + static void accountDescription(const std::string& account, const std::string& description, sqlite3 *db); }; diff --git a/src/optHandlers/accountOperation.cpp b/src/optHandlers/accountOperation.cpp index 3b4f248..93be52f 100644 --- a/src/optHandlers/accountOperation.cpp +++ b/src/optHandlers/accountOperation.cpp @@ -26,6 +26,10 @@ void AccountOperation::commit() { if (flags.value) { std::cout << Database::getValue(account, db) << std::endl; } + + if (!flags.description.empty()) { + Database::accountDescription(account, flags.description, db); + } } AccountOperation::AccountOperation(sqlite3 *db, std::string account) : Operation(db), account(std::move(account)) { diff --git a/src/optHandlers/mainOptHandler.cpp b/src/optHandlers/mainOptHandler.cpp index fa25e47..0c8d79b 100644 --- a/src/optHandlers/mainOptHandler.cpp +++ b/src/optHandlers/mainOptHandler.cpp @@ -64,13 +64,13 @@ void MainOptHandler::accountOptHandler(std::string account) { {"delete", no_argument, nullptr, 'd'}, {"force-delete", no_argument, nullptr, 'F'}, {"value", no_argument, nullptr, 'v'}, - {"description", no_argument, nullptr, 'D'}, + {"description", required_argument, nullptr, 'D'}, }; auto acctOperation = std::make_unique(db, account); while (true) { - int opt = getopt_long(argv.size(), argv.data(), "ha:c:e:p:dFvD", accountLongOpts, nullptr); + int opt = getopt_long(argv.size(), argv.data(), "ha:c:e:p:dFvD:", accountLongOpts, nullptr); if (opt == -1) break; @@ -238,7 +238,7 @@ void MainOptHandler::paymentOptHandler(std::string account) { auto payOperation = std::make_unique(db, account); while (true) { - int opt = getopt_long(argv.size(), argv.data(), "ha:c:e:p:v:d:r:D", paymentLongOpts, nullptr); + int opt = getopt_long(argv.size(), argv.data(), "ha:c:e:p:v:d:r:D:", paymentLongOpts, nullptr); if (opt == -1) break;