summaryrefslogtreecommitdiff
path: root/src
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
parent4417e2a50e0ae34abf68039ecd03975b463bdb50 (diff)
added exception handler for transactions
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp21
-rw-r--r--src/postgresHandler.cpp43
2 files changed, 47 insertions, 17 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 27397f0..bf1d53d 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -9,12 +9,19 @@ int main() {
"postgresql://aotrix@localhost:5432/hearthstonegameinfo"};
pqxx::work tx{cx};
- const unsigned int card_id = 217;
- std::string card =
- hs_handler.get_cards(std::format("/{}?locale=fr_FR", card_id));
- std::cout << card << std::endl;
- add_cards_to_database(card, tx);
-
- tx.commit();
+ try {
+ std::string cards = hs_handler.get_cards(
+ "/108499?locale=fr_FR&gameMode=constructed&pageSize=2");
+ std::cout << cards << std::endl;
+ add_cards_to_database(cards, tx);
+ tx.commit();
+ } catch (pqxx::sql_error const &e) {
+ std::cerr << "SQL error: " << e.what() << std::endl;
+ std::cerr << "Query was: " << e.query() << std::endl;
+ return 2;
+ } catch (std::exception const &e) {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return 1;
+ }
return 0;
}
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);
}
}