summaryrefslogtreecommitdiff
path: root/src/postgresHandler.cpp
diff options
context:
space:
mode:
authorAotrix <[email protected]>2025-08-17 19:46:50 +0200
committerAotrix <[email protected]>2025-08-17 19:46:50 +0200
commite0d4ce7dcebe3230993bd9488723ce8766e6918d (patch)
tree6665bf5d38daf33391f90ad2b2ff7a0adb35d40f /src/postgresHandler.cpp
parent33e354c2f15a61b7edd78a8c271aae6b5eff5e44 (diff)
removed GLOB in CMakeLists.txt and added FIXME comments
Diffstat (limited to 'src/postgresHandler.cpp')
-rw-r--r--src/postgresHandler.cpp101
1 files changed, 36 insertions, 65 deletions
diff --git a/src/postgresHandler.cpp b/src/postgresHandler.cpp
index 4574f95..c0276f1 100644
--- a/src/postgresHandler.cpp
+++ b/src/postgresHandler.cpp
@@ -11,17 +11,13 @@
#define KEY_ID 1
-const std::map<std::string, std::string> aCardValueTypeToRegex = {
- {"INT", "[0-9]+"},
- {"STRING", "\"[^\"?]*\""},
- {"LIST_OF_INT", "\\[[0-9,]*\\]"},
- {"NULL", "null"},
- {"BOOL", "true|false"}};
-
-const pqxx::result executeQuery(pqxx::work &aTransaction,
- std::string_view aQuery) {
- return aTransaction.exec(aQuery);
-}
+const std::map<std::string, std::string> aCardValueTypeToRegex = {{"INT", "[0-9]+"},
+ {"STRING", "\"[^\"?]*\""},
+ {"LIST_OF_INT", "\\[[0-9,]*\\]"},
+ {"NULL", "null"},
+ {"BOOL", "true|false"}};
+
+const pqxx::result executeQuery(pqxx::work &aTransaction, std::string_view aQuery) { return aTransaction.exec(aQuery); }
std::ostream &operator<<(std::ostream &aOstream, const pqxx::result &kResult) {
const int kNbColumnsInResult = kResult.columns();
@@ -34,13 +30,11 @@ std::ostream &operator<<(std::ostream &aOstream, const pqxx::result &kResult) {
return aOstream;
}
-const unsigned int
-getTypeIndexOfRegexIterator(const std::sregex_iterator &kSregexIt) {
+const unsigned int getTypeIndexOfRegexIterator(const std::sregex_iterator &kSregexIt) {
// TODO: remove hardcoded variable because it is... weird.
// The input should already be the "value" part?
const unsigned int offset = 2;
- for (size_t aCardInfoType = 0; aCardInfoType < aCardValueTypeToRegex.size();
- aCardInfoType++) {
+ for (size_t aCardInfoType = 0; aCardInfoType < aCardValueTypeToRegex.size(); aCardInfoType++) {
if ((*kSregexIt)[aCardInfoType] != "") {
return offset + aCardInfoType;
}
@@ -48,8 +42,7 @@ getTypeIndexOfRegexIterator(const std::sregex_iterator &kSregexIt) {
throw std::invalid_argument("regex iterator input is invalid");
}
-const std::string format_json_value_to_sql(const std::string &kTypeOfValue,
- const std::string &kValueFromJSON) {
+const std::string format_json_value_to_sql(const std::string &kTypeOfValue, const std::string &kValueFromJSON) {
// TODO: show an error if a type is no longer here,
// to avoid having useless conditions
// FIXME: it does not scale well, a bit ugly... should be a single line
@@ -89,31 +82,20 @@ std::string format_key(const std::string &key) {
return key_copy;
}
-static void
-add_single_card_to_database(const std::string &kCards, pqxx::work &aTransaction,
- const std::regex &kKeyRegex,
- const std::string::size_type &kIdPos,
- const std::string::size_type &kClosingBracketPos) {
- auto words_begin = std::sregex_iterator(
- std::next(kCards.begin(), kIdPos),
- std::next(kCards.begin(), kClosingBracketPos), kKeyRegex);
+static void add_single_card_to_database(const std::string &kCards, pqxx::work &aTransaction,
+ const std::regex &kKeyRegex, const std::string::size_type &kIdPos,
+ const std::string::size_type &kClosingBracketPos) {
+ auto words_begin = std::sregex_iterator(std::next(kCards.begin(), kIdPos),
+ std::next(kCards.begin(), kClosingBracketPos), kKeyRegex);
auto words_end = std::sregex_iterator();
if (words_begin != words_end) {
std::string insert_columns("INSERT INTO cards (");
std::string values(" VALUES (");
- for (std::sregex_iterator kSregexIt = words_begin;
- kSregexIt != words_end; ++kSregexIt) {
- insert_columns.append(format_key((*kSregexIt)[KEY_ID].str()) +
- ","); // key
- const unsigned int kTypeIndexOfValue =
- getTypeIndexOfRegexIterator(kSregexIt);
- const std::string kTypeNameOfValue =
- std::next(aCardValueTypeToRegex.begin(), kTypeIndexOfValue)
- ->first;
- values.append(
- format_json_value_to_sql(
- kTypeNameOfValue, (*kSregexIt)[kTypeIndexOfValue].str()) +
- ",");
+ for (std::sregex_iterator kSregexIt = words_begin; kSregexIt != words_end; ++kSregexIt) {
+ insert_columns.append(format_key((*kSregexIt)[KEY_ID].str()) + ","); // key
+ const unsigned int kTypeIndexOfValue = getTypeIndexOfRegexIterator(kSregexIt);
+ const std::string kTypeNameOfValue = std::next(aCardValueTypeToRegex.begin(), kTypeIndexOfValue)->first;
+ values.append(format_json_value_to_sql(kTypeNameOfValue, (*kSregexIt)[kTypeIndexOfValue].str()) + ",");
}
*std::prev(insert_columns.end()) = ')';
*std::prev(values.end()) = ')';
@@ -133,44 +115,34 @@ const std::regex regexKeyValueInJSON() {
return std::regex(aRegexString);
}
-const std::string::size_type
-startPosOfCardJSON(const std::string &kCardsPageJSON,
- const std::string::size_type kSearchStartPos = 0) {
+const std::string::size_type startPosOfCardJSON(const std::string &kCardsPageJSON,
+ const std::string::size_type kSearchStartPos = 0) {
return kCardsPageJSON.find("{\"id", kSearchStartPos);
}
-const std::string::size_type
-endPosOfCardJSON(const std::string &kCardsPageJSON,
- const std::string::size_type kSearchStartPos = 0) {
+const std::string::size_type endPosOfCardJSON(const std::string &kCardsPageJSON,
+ const std::string::size_type kSearchStartPos = 0) {
return kCardsPageJSON.find("}", kSearchStartPos);
}
-void addCardsToDatabase(HearthstoneAPIHandler &aAPIIntermediate,
- pqxx::work &aTransaction,
+void addCardsToDatabase(HearthstoneAPIHandler &aAPIIntermediate, pqxx::work &aTransaction,
const std::string &kURLOfCardsPage) {
const std::regex aRegexKeyValueInJSON = regexKeyValueInJSON();
- const std::string &kCardsPageJSON =
- aAPIIntermediate.get_cards(kURLOfCardsPage);
+ const std::string &kCardsPageJSON = aAPIIntermediate.get_cards(kURLOfCardsPage);
std::string::size_type aCardStartPos = startPosOfCardJSON(kCardsPageJSON);
std::string::size_type aCardEndPos = endPosOfCardJSON(kCardsPageJSON);
- while (aCardStartPos != std::string::npos &&
- aCardEndPos != std::string::npos) {
- add_single_card_to_database(kCardsPageJSON, aTransaction,
- aRegexKeyValueInJSON, aCardStartPos,
- aCardEndPos);
+ while (aCardStartPos != std::string::npos && aCardEndPos != std::string::npos) {
+ add_single_card_to_database(kCardsPageJSON, aTransaction, aRegexKeyValueInJSON, aCardStartPos, aCardEndPos);
aCardStartPos = startPosOfCardJSON(kCardsPageJSON, aCardStartPos + 1);
aCardEndPos = endPosOfCardJSON(kCardsPageJSON, aCardEndPos + 1);
}
}
-void clearCardDatabase(pqxx::work &aTransaction) {
- executeQuery(aTransaction, "DELETE FROM cards");
-}
+void clearCardDatabase(pqxx::work &aTransaction) { executeQuery(aTransaction, "DELETE FROM cards"); }
const uint32_t numberOfPagesInSetOfCards(const std::string &cards) {
std::regex key_regex("\"pageCount\":([0-9]+)");
- auto nb_pages_begin =
- std::sregex_iterator(cards.begin(), cards.end(), key_regex);
+ auto nb_pages_begin = std::sregex_iterator(cards.begin(), cards.end(), key_regex);
auto nb_pages_end = std::sregex_iterator();
if (nb_pages_begin != nb_pages_end) {
return std::stoi((*nb_pages_begin)[1].str());
@@ -181,25 +153,24 @@ const uint32_t numberOfPagesInSetOfCards(const std::string &cards) {
void refresh_cards_table() {
try {
pqxx::connection aConnection{
- "postgresql://aotrix@localhost:5432/hearthstonegameinfo"};
+ "postgresql://aotrix@localhost:5432/hearthstonegameinfo"}; // FIXME: load a .xml file instead
pqxx::work aTransaction{aConnection};
HearthstoneAPIHandler aAPIConnector;
std::string aCards =
- aAPIConnector.get_cards("/?locale=fr_FR&gameMode=constructed");
+ aAPIConnector.get_cards("/?locale=fr_FR&gameMode=constructed"); // FIXME: use a struct as a parameter
clearCardDatabase(aTransaction);
addCardsToDatabase(aAPIConnector, aTransaction,
- "/?locale=fr_FR&gameMode=constructed");
+ "/?locale=fr_FR&gameMode=constructed"); // FIXME: To which
+ // table? to a more generic function
const uint32_t kNbPages = numberOfPagesInSetOfCards(aCards);
// FIXME: [Process exited 139]
// for (int i = 2; i < kNbPages; i++) {
for (uint32_t i = 2; i < 3; i++) {
- const std::string kCardsPageURL{
- std::format("/?locale=fr_FR&gameMode=constructed&page={}", i)};
+ const std::string kCardsPageURL{std::format("/?locale=fr_FR&gameMode=constructed&page={}", i)};
addCardsToDatabase(aAPIConnector, aTransaction, kCardsPageURL);
}
- std::cout << "number of cards in database: "
- << executeQuery(aTransaction, "SELECT COUNT(*) FROM cards")
+ std::cout << "number of cards in database: " << executeQuery(aTransaction, "SELECT COUNT(*) FROM cards")
<< std::endl;
aTransaction.commit();
} catch (pqxx::sql_error const &kSqlError) {