summaryrefslogtreecommitdiff
path: root/src/postgresHandler.cpp
diff options
context:
space:
mode:
authorAotrix <[email protected]>2025-03-27 02:48:28 +0100
committerAotrix <[email protected]>2025-03-27 02:48:28 +0100
commit31ab522fb80473676ff31f3434f4651a1a4ee1a3 (patch)
tree5c7affc9296b628d64382b37cabe449314637671 /src/postgresHandler.cpp
parent4417e2a50e0ae34abf68039ecd03975b463bdb50 (diff)
added exception handler for transactions
Diffstat (limited to 'src/postgresHandler.cpp')
-rw-r--r--src/postgresHandler.cpp43
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);
}
}