diff options
| author | Aotrix <[email protected]> | 2025-03-27 02:48:28 +0100 |
|---|---|---|
| committer | Aotrix <[email protected]> | 2025-03-27 02:48:28 +0100 |
| commit | 31ab522fb80473676ff31f3434f4651a1a4ee1a3 (patch) | |
| tree | 5c7affc9296b628d64382b37cabe449314637671 /src/postgresHandler.cpp | |
| parent | 4417e2a50e0ae34abf68039ecd03975b463bdb50 (diff) | |
added exception handler for transactions
Diffstat (limited to 'src/postgresHandler.cpp')
| -rw-r--r-- | src/postgresHandler.cpp | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/src/postgresHandler.cpp b/src/postgresHandler.cpp index d80157e..e3e8d0b 100644 --- a/src/postgresHandler.cpp +++ b/src/postgresHandler.cpp @@ -1,6 +1,7 @@ #include "postgresHandler.h" #include <cctype> #include <cstddef> +#include <cstdlib> #include <iostream> #include <regex> #include <stdexcept> @@ -10,6 +11,7 @@ #define STRING_INDEX 4 #define LIST_OF_INT_INDEX 5 #define NULL_INDEX 6 +#define BOOL_INDEX 7 const pqxx::result execute_query(pqxx::work &t_transaction, std::string_view t_query) { @@ -28,8 +30,8 @@ void display_query_result(const pqxx::result &t_r) { static const unsigned int get_type_of_regex_iterator(const std::sregex_iterator &t_sregex_it) { - std::array<int, 4> types{INT_INDEX, STRING_INDEX, LIST_OF_INT_INDEX, - NULL_INDEX}; + std::array<int, 5> types{INT_INDEX, STRING_INDEX, LIST_OF_INT_INDEX, + NULL_INDEX, BOOL_INDEX}; for (const int &type : types) { if ((*t_sregex_it)[type] != "") { return type; @@ -41,6 +43,7 @@ get_type_of_regex_iterator(const std::sregex_iterator &t_sregex_it) { const std::string format_json_value_to_sql(const unsigned int &t_type_index, const std::string &t_json_value) { switch (t_type_index) { + case BOOL_INDEX: case INT_INDEX: return t_json_value; case STRING_INDEX: { @@ -79,12 +82,14 @@ std::string format_key(const std::string &key) { return key_copy; } -void add_cards_to_database(const std::string &t_cards, pqxx::work &t_tx) { - std::regex key_regex( - "\"([^\"?]+)\":(([0-9]+)|(\"[^\"?]*\")|(\\[[0-9,]*\\])|(null))"); - - auto words_begin = - std::sregex_iterator(t_cards.begin(), t_cards.end(), key_regex); +static void +add_single_card_to_database(const std::string &t_cards, pqxx::work &t_tx, + const std::regex &key_regex, + const std::string::size_type &id_pos, + const std::string::size_type &closing_bracket_pos) { + auto words_begin = std::sregex_iterator( + std::next(t_cards.begin(), id_pos), + std::next(t_cards.begin(), closing_bracket_pos), key_regex); auto words_end = std::sregex_iterator(); if (words_begin != words_end) { std::string insert_columns("INSERT INTO cards ("); @@ -99,8 +104,26 @@ void add_cards_to_database(const std::string &t_cards, pqxx::work &t_tx) { } *std::prev(insert_columns.end()) = ')'; *std::prev(values.end()) = ')'; - values.append(" ON CONFLICT (id) DO NOTHING;"); - execute_query(t_tx, insert_columns + values); + insert_columns.append(values); + insert_columns.append(" ON CONFLICT (id) DO NOTHING;"); + std::cout << insert_columns.length() << std::endl; + std::cout << insert_columns << std::endl; + execute_query(t_tx, insert_columns); + } +} + +void add_cards_to_database(const std::string &t_cards, pqxx::work &t_tx) { + std::regex key_regex("\"([^\"?]+)\":(([0-9]+)|(\"[^\"?]*\")|(\\[[0-9,]*\\])" + "|(null)|(true|false))"); + + std::string::size_type id_pos = t_cards.find("{\"id"); + std::string::size_type closing_bracket_pos = t_cards.find("}"); + while (id_pos != std::string::npos && + closing_bracket_pos != std::string::npos) { + add_single_card_to_database(t_cards, t_tx, key_regex, id_pos, + closing_bracket_pos); + id_pos = t_cards.find("{\"id", id_pos + 1); + closing_bracket_pos = t_cards.find("}", closing_bracket_pos + 1); } } |
