diff options
| -rw-r--r-- | CMakeLists.txt | 18 | ||||
| -rw-r--r-- | include/startMenu.hpp | 16 | ||||
| -rw-r--r-- | resources/token_info.txt | 2 | ||||
| -rw-r--r-- | src/main.cpp | 2 | ||||
| -rw-r--r-- | src/postgresHandler.cpp | 101 |
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) { |
