From 1db3eb2f8c7aafde760101403a9a2dedaefc0273 Mon Sep 17 00:00:00 2001 From: kdeng00 Date: Sat, 24 Aug 2019 18:41:01 -0400 Subject: [PATCH] Cover art record saved in the database. Next is to save the song record to the database and then try to download the song afterwards --- CMakeLists.txt | 6 +- include/database/coverArtRepository.h | 4 + include/database/songRepository.h | 13 +++- include/models/models.h | 1 + include/types/coverFilter.h | 11 +++ include/types/songFilter.h | 14 ++++ src/database/base_repository.cpp | 17 +++-- src/database/coverArtRepository.cpp | 103 ++++++++++++++++++++++++++ src/database/songRepository.cpp | 35 +++++++++ src/managers/coverArtManager.cpp | 5 ++ src/managers/song_manager.cpp | 5 ++ 11 files changed, 205 insertions(+), 9 deletions(-) create mode 100644 include/types/coverFilter.h create mode 100644 include/types/songFilter.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c64957..80ebf11 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,7 +11,7 @@ set(SOURCES src/controller/songController.hpp src/database/base_repository.cpp src/database/coverArtRepository.cpp - #src/database/songRepository.cpp + src/database/songRepository.cpp src/dto/loginResultDto.hpp src/main.cpp src/managers/coverArtManager.cpp @@ -24,7 +24,7 @@ set(SOURCES set(HEADERS include/database/base_repository.h include/database/coverArtRepository.h - #include/database/songRepository.h + include/database/songRepository.h include/managers/coverArtManager.h include/managers/directory_manager.h include/managers/song_manager.h @@ -32,7 +32,9 @@ set(HEADERS include/models/models.h include/utilities/imageFile.h include/utilities/metadata_retriever.h + include/types/coverFilter.h include/types/scopes.h + include/types/songFilter.h ) set (TAGLIB diff --git a/include/database/coverArtRepository.h b/include/database/coverArtRepository.h index aaf96ed..dd5ad11 100644 --- a/include/database/coverArtRepository.h +++ b/include/database/coverArtRepository.h @@ -5,14 +5,18 @@ #include "database/base_repository.h" #include "models/models.h" +#include "types/coverFilter.h" class coverArtRepository : public base_repository { public: coverArtRepository(const std::string&); + Cover retrieveRecord(Cover&, coverFilter); + void saveRecord(const Cover&); private: + Cover parseRecord(MYSQL_RES*); }; #endif diff --git a/include/database/songRepository.h b/include/database/songRepository.h index f52535d..f442c5b 100644 --- a/include/database/songRepository.h +++ b/include/database/songRepository.h @@ -1,14 +1,25 @@ #ifndef SONGREPOSITORY_H_ #define SONGREPOSITORY_H_ +#include + #include +#include "database/base_repository.h" #include "models/models.h" +#include "types/songFilter.h" -class songRespository +class songRepository : public base_repository { public: + songRepository(const std::string&); + + Song retrieveRecord(Song&, songFilter); + + void saveRecord(const Song&); private: + std::vector parseRecords(MYSQL_RES*); + Song parseRecord(MYSQL_RES*); }; #endif diff --git a/include/models/models.h b/include/models/models.h index 1d027da..b619b5b 100644 --- a/include/models/models.h +++ b/include/models/models.h @@ -15,6 +15,7 @@ struct Song int duration; std::string songPath; std::vector data; + int coverArtId; }; struct Cover diff --git a/include/types/coverFilter.h b/include/types/coverFilter.h new file mode 100644 index 0000000..b334a8a --- /dev/null +++ b/include/types/coverFilter.h @@ -0,0 +1,11 @@ +#ifndef COVERFILTER_H_ +#define COVERFILTER_H_ + +enum class coverFilter +{ + id = 0, + songTitle, + imagePath +}; + +#endif diff --git a/include/types/songFilter.h b/include/types/songFilter.h new file mode 100644 index 0000000..85a3c46 --- /dev/null +++ b/include/types/songFilter.h @@ -0,0 +1,14 @@ +#ifndef SONGFILTER_H_ +#define SONGFILTER_H_ + +enum class songFilter +{ + id = 0, + title, + album, + artist, + genre, + year +}; + +#endif diff --git a/src/database/base_repository.cpp b/src/database/base_repository.cpp index 02b68ca..c55b91f 100644 --- a/src/database/base_repository.cpp +++ b/src/database/base_repository.cpp @@ -1,5 +1,7 @@ #include "database/base_repository.h" +#include + #include #include "managers/directory_manager.h" @@ -16,8 +18,10 @@ MYSQL* base_repository::setup_mysql_connection() { MYSQL *conn = mysql_init(nullptr); - auto res = mysql_real_connect(conn, details.server.c_str(), details.username.c_str(), - details.password.c_str(), details.database.c_str(), 0, nullptr, 0); + if (!mysql_real_connect(conn, details.server.c_str(), details.username.c_str(), + details.password.c_str(), details.database.c_str(), 0, nullptr, 0)) { + std::cout << "connection error" << std::endl; + } return conn; } @@ -48,8 +52,9 @@ MYSQL_RES* base_repository::perform_mysql_query(MYSQL *conn, const std::string& void base_repository::intitalizeDetails() { auto databaseConfig = directory_manager::databaseConfigContent(path); - details.database = databaseConfig.get(); - details.password = databaseConfig.get(); - details.server = databaseConfig.get(); - details.username = databaseConfig.get(); + + details.database = databaseConfig["database"].get(); + details.password = databaseConfig["password"].get(); + details.server = databaseConfig["server"].get(); + details.username = databaseConfig["username"].get(); } diff --git a/src/database/coverArtRepository.cpp b/src/database/coverArtRepository.cpp index 94dcbe5..719eadb 100644 --- a/src/database/coverArtRepository.cpp +++ b/src/database/coverArtRepository.cpp @@ -1,9 +1,112 @@ #include "database/coverArtRepository.h" +#include +#include +#include +#include coverArtRepository::coverArtRepository(const std::string& path) : base_repository(path) { } +Cover coverArtRepository::retrieveRecord(Cover& cov, coverFilter filter = coverFilter::id) +{ + std::stringstream qry; + auto conn = setup_mysql_connection(); + qry << "SELECT * FROM CoverArt WHERE "; + + std::unique_ptr param; + switch (filter) { + case coverFilter::id: + qry << "CoverArtId = " << cov.id; + break; + case coverFilter::songTitle: + param = std::make_unique(new char[cov.songTitle.size()]); + mysql_real_escape_string(conn, *param, cov.songTitle.c_str(), cov.songTitle.size()); + std::cout << *param << std::endl; + qry << "SongTitle = '" << *param << "'"; + break; + case coverFilter::imagePath: + param = std::make_unique(new char[cov.imagePath.size()]); + mysql_real_escape_string(conn, *param, cov.imagePath.c_str(), cov.imagePath.size()); + std::cout << *param << std::endl; + qry << "ImagePath = '" << *param << "'"; + break; + } + + const std::string query = qry.str(); + std::cout << query << std::endl; + auto results = perform_mysql_query(conn, query); + std::cout << "the query has been performed" << std::endl; + + auto covDb = parseRecord(results); + + mysql_close(conn); + std::cout << "done" << std::endl; + + return covDb; +} + + void coverArtRepository::saveRecord(const Cover& cov) { + auto conn = setup_mysql_connection(); + + MYSQL_STMT *stmt; + MYSQL_BIND params[2]; + my_bool isNull; + int status; + + stmt = mysql_stmt_init(conn); + + const std::string query = "INSERT INTO CoverArt(SongTitle, ImagePath) VALUES(?, ?)"; + + status = mysql_stmt_prepare(stmt, query.c_str(), query.size()); + + memset(params, 0, sizeof(params)); + + params[0].buffer_type = MYSQL_TYPE_STRING; + params[0].buffer = (char*)cov.songTitle.c_str(); + auto songTitleLength = cov.songTitle.size(); + params[0].length = &songTitleLength; + params[0].is_null = 0; + + params[1].buffer_type = MYSQL_TYPE_STRING; + params[1].buffer = (char*)cov.imagePath.c_str(); + auto imagePathLength = cov.imagePath.size(); + params[1].length = &imagePathLength; + params[1].is_null = 0; + + status = mysql_stmt_bind_param(stmt, params); + status = mysql_stmt_execute(stmt); + + mysql_stmt_close(stmt); + mysql_close(conn); + + std::cout << "done" << std::endl; +} + +Cover coverArtRepository::parseRecord(MYSQL_RES *results) +{ + std::cout << "parsing record" << std::endl; + Cover cov; + auto fieldNum = mysql_num_fields(results); + + MYSQL_ROW row = mysql_fetch_row(results); + + for (auto i = 0; i != fieldNum; ++i) { + switch (i) { + case 0: + cov.id = std::stoi(row[i]); + break; + case 1: + cov.songTitle = row[i]; + break; + case 2: + cov.imagePath = row[i]; + break; + } + } + std::cout << "done parsing record" << std::endl; + + return cov; } diff --git a/src/database/songRepository.cpp b/src/database/songRepository.cpp index e69de29..55a088c 100644 --- a/src/database/songRepository.cpp +++ b/src/database/songRepository.cpp @@ -0,0 +1,35 @@ +#include "database/songRepository.h" + +#include +#include +#include +#include + +songRepository::songRepository(const std::string& path) : base_repository(path) +{ } + +Song songRepository::retrieveRecord(Song& song, songFilter) +{ + + return song; +} + +void songRepository::saveRecord(const Song& song) +{ + // TODO: pick up here. Save the song record to the database +} + +std::vector songRepository::parseRecords(MYSQL_RES* results) +{ + std::vector songs; + + + return songs; +} + +Song songRepository::parseRecord(MYSQL_RES* results) +{ + Song song; + + return song; +} diff --git a/src/managers/coverArtManager.cpp b/src/managers/coverArtManager.cpp index 6d186e0..c2fa75d 100644 --- a/src/managers/coverArtManager.cpp +++ b/src/managers/coverArtManager.cpp @@ -1,6 +1,7 @@ #include "managers/coverArtManager.h" #include "database/coverArtRepository.h" +#include "types/coverFilter.h" #include "utilities/metadata_retriever.h" coverArtManager::coverArtManager(const std::string& configPath) : path(configPath) @@ -16,6 +17,10 @@ Cover coverArtManager::saveCover(const Song& song, std::string& rootPath, const cov.songTitle = song.title; coverArtRepository covRepo(path); + std::cout << "saving record to the database" << std::endl; + covRepo.saveRecord(cov); + std::cout << "retrieving record from database" << std::endl; + cov = covRepo.retrieveRecord(cov, coverFilter::songTitle); return cov; } diff --git a/src/managers/song_manager.cpp b/src/managers/song_manager.cpp index f7d29e1..cce4592 100644 --- a/src/managers/song_manager.cpp +++ b/src/managers/song_manager.cpp @@ -6,6 +6,7 @@ #include +#include "database/songRepository.h" #include "managers/coverArtManager.h" #include "managers/directory_manager.h" #include "utilities/metadata_retriever.h" @@ -34,6 +35,10 @@ void song_manager::saveSong(Song& song) stockCoverPath.append("/CoverArt.png"); auto cov = covMgr.saveCover(song, coverRootPath, stockCoverPath); + song.coverArtId = cov.id; + + songRepository songRepo(exe_path); + songRepo.saveRecord(song); } void song_manager::printSong(const Song& song)