summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt18
-rw-r--r--include/startMenu.hpp16
-rw-r--r--resources/token_info.txt2
-rw-r--r--src/main.cpp2
-rw-r--r--src/postgresHandler.cpp101
5 files changed, 49 insertions, 90 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d70e78b..595e0cd 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -13,13 +13,19 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 -Wall")
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
add_definitions(-DSOURCE_DIR_PATH="${CMAKE_SOURCE_DIR}")
+set(INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
+set(SRC_FILES
+ ${PROJECT_SOURCE_DIR}/src/main.cpp
+ ${PROJECT_SOURCE_DIR}/src/cardTypeHandlerInfo.cpp
+ ${PROJECT_SOURCE_DIR}/src/hearthstoneAPIHandler.cpp
+ ${PROJECT_SOURCE_DIR}/src/postgresHandler.cpp)
+set(SRC_TESTS_FILES ${PROJECT_SOURCE_DIR}/src/tests/tests.cpp)
+
+add_executable(${FNAME} ${SRC_FILES})
+target_include_directories(${FNAME} PRIVATE ${INCLUDE_DIR})
+target_link_libraries(${FNAME} pqxx pq curl)
+
find_package(Catch2 3 REQUIRED)
-file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/src/*.cpp)
-file(GLOB SRC_TESTS_FILES ${PROJECT_SOURCE_DIR}/src/tests/*.cpp)
-file(GLOB INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include)
add_executable(tests ${SRC_FILES} ${SRC_TESTS_FILES})
target_include_directories(tests PRIVATE ${INCLUDE_DIR})
target_link_libraries(tests PRIVATE Catch2::Catch2WithMain pqxx pq curl)
-add_executable(${FNAME} ${SRC_FILES})
-target_include_directories(${FNAME} PRIVATE ${INCLUDE_DIR})
-target_link_libraries(${FNAME} pqxx pq curl)
diff --git a/include/startMenu.hpp b/include/startMenu.hpp
deleted file mode 100644
index 0168424..0000000
--- a/include/startMenu.hpp
+++ /dev/null
@@ -1,16 +0,0 @@
-#pragma once
-#include <format>
-#include <iostream>
-
-template <typename... FunctionType>
-void launchFunction(FunctionType... aFunctions) {
- std::cout << "MENU: SELECT THE FUNCTION\n"
- << "=========================" << std::endl;
- for (size_t aFunctionIndex = 0; aFunctionIndex < sizeof...(aFunctions);
- aFunctionIndex++) {
- std::cout << std::format("{}) {}", aFunctionIndex + 1,
- "currentFunctionName") // FIXME: replace this
- << std::endl;
- }
- std::cout << "=========================" << std::endl;
-}
diff --git a/resources/token_info.txt b/resources/token_info.txt
index 4fb57e1..667a347 100644
--- a/resources/token_info.txt
+++ b/resources/token_info.txt
@@ -1 +1 @@
-EUEANCs8kKKoZx9u5BMgGeduWvckx8GjF2 1755428783 \ No newline at end of file
+EUjMrxBxM5srVkY9gs5Tfrzfc3kVGudWMs 1755534579 \ No newline at end of file
diff --git a/src/main.cpp b/src/main.cpp
index 37c1525..60b948a 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,9 +1,7 @@
#include "postgresHandler.hpp"
-#include "startMenu.hpp"
#include <pqxx/pqxx>
int main() {
refresh_cards_table();
- launchFunction(refresh_cards_table);
return 0;
}
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) {