Compare commits
No commits in common. "9705426c3159bd5f8f2dd5ab3bfbbe157d1e3c47" and "97e444c91ce0dfe1396d621d3afd64e61047ad9e" have entirely different histories.
9705426c31
...
97e444c91c
8 changed files with 36 additions and 79 deletions
|
@ -1,62 +1,31 @@
|
||||||
#include "database.h"
|
#include "database.h"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
Database::Database(const std::string& dbname) : db_(nullptr)
|
Database::Database(const std::string& dbname) : db(nullptr)
|
||||||
{
|
{
|
||||||
const int errCode = sqlite3_open(dbname.c_str(), &db_);
|
const int errCode = sqlite3_open(dbname.c_str(), &db);
|
||||||
if (errCode) {
|
if (errCode) {
|
||||||
throw std::runtime_error("Could not open database file.");
|
throw std::runtime_error("Could not open database file.");
|
||||||
}
|
}
|
||||||
exec("PRAGMA foreign_key = 1");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Database::~Database() { sqlite3_close(db_); }
|
Database::~Database() { sqlite3_close(db); }
|
||||||
|
|
||||||
void Database::exec(const std::string& sql)
|
void Database::exec(const std::string& sql)
|
||||||
{
|
{
|
||||||
const int errCode = sqlite3_exec(db_, sql.c_str(), nullptr, nullptr, nullptr);
|
const int errCode = sqlite3_exec(db, sql.c_str(), nullptr, nullptr, nullptr);
|
||||||
if (errCode) {
|
if (errCode) {
|
||||||
throw std::runtime_error("Error in SQL execution.");
|
throw std::runtime_error("Error in SQL execution.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::init()
|
void Database::beginTransaction()
|
||||||
{
|
{
|
||||||
std::string sqlCreateSellers{
|
exec("BEGIN TRANSACTION");
|
||||||
"CREATE TABLE IF NOT EXISTS sellers ("
|
|
||||||
"id TEXT PRIMARY KEY NOT NULL, "
|
|
||||||
"seller_no INTEGER, "
|
|
||||||
"first_name TEXT, "
|
|
||||||
"last_name TEXT, "
|
|
||||||
"offered_articles INTEGER, "
|
|
||||||
"UNIQUE (seller_no)"
|
|
||||||
");"
|
|
||||||
};
|
|
||||||
|
|
||||||
std::string sqlCreateArticles{
|
|
||||||
"CREATE TABLE IF NOT EXISTS articles ("
|
|
||||||
"id TEXT PRIMARY KEY NOT NULL, "
|
|
||||||
"seller_id TEXT NOT NULL, "
|
|
||||||
"source_no INTEGER NOT NULL, "
|
|
||||||
"article_no INTEGER NOT NULL, "
|
|
||||||
"description TEXT, "
|
|
||||||
"price INTEGER NOT NULL, "
|
|
||||||
"UNIQUE (source_no, article_no), "
|
|
||||||
"FOREIGN KEY (seller_id) REFERENCES sellers(id) ON DELETE CASCADE, "
|
|
||||||
"CHECK (article_no BETWEEN 0 AND 99999)"
|
|
||||||
");"
|
|
||||||
};
|
|
||||||
|
|
||||||
std::cout << sqlCreateArticles << "\n";
|
|
||||||
|
|
||||||
beginTransaction();
|
|
||||||
exec(sqlCreateSellers);
|
|
||||||
exec(sqlCreateArticles);
|
|
||||||
endTransaction();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Database::beginTransaction() { exec("BEGIN TRANSACTION"); }
|
void Database::endTransaction()
|
||||||
|
{
|
||||||
void Database::endTransaction() { exec("END TRANSACTION"); }
|
exec("END TRANSACTION");
|
||||||
|
}
|
|
@ -13,9 +13,8 @@ public:
|
||||||
Database(const Database&) = delete;
|
Database(const Database&) = delete;
|
||||||
Database& operator=(const Database&) = delete;
|
Database& operator=(const Database&) = delete;
|
||||||
void exec(const std::string& sql);
|
void exec(const std::string& sql);
|
||||||
void init();
|
|
||||||
private:
|
private:
|
||||||
sqlite3 *db_;
|
sqlite3 *db;
|
||||||
void beginTransaction();
|
void beginTransaction();
|
||||||
void endTransaction();
|
void endTransaction();
|
||||||
};
|
};
|
||||||
|
|
|
@ -5,21 +5,18 @@
|
||||||
#include <boost/uuid/uuid_generators.hpp>
|
#include <boost/uuid/uuid_generators.hpp>
|
||||||
#include <boost/uuid/uuid_io.hpp>
|
#include <boost/uuid/uuid_io.hpp>
|
||||||
|
|
||||||
|
//Entity::Entity() {}
|
||||||
|
|
||||||
Entity::~Entity() {}
|
Entity::~Entity() {}
|
||||||
|
|
||||||
void Entity::createUuid()
|
void Entity::createUuid()
|
||||||
{
|
{
|
||||||
static boost::uuids::random_generator generator{};
|
static boost::uuids::random_generator generator{};
|
||||||
uuid_ = generator();
|
uuid = generator();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Entity::createUuidFromString(const std::string& uuidString)
|
void Entity::createUuidFromString(const std::string& uuidString)
|
||||||
{
|
{
|
||||||
boost::uuids::string_generator generator{};
|
boost::uuids::string_generator generator{};
|
||||||
uuid_ = generator(uuidString);
|
uuid = generator(uuidString);
|
||||||
}
|
|
||||||
|
|
||||||
inline Entity::State Entity::getState()
|
|
||||||
{
|
|
||||||
return state_;
|
|
||||||
}
|
}
|
|
@ -8,17 +8,14 @@
|
||||||
class Entity
|
class Entity
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
enum class State { NEW, UPDATED, READ };
|
//Entity();
|
||||||
// Entity();
|
|
||||||
virtual ~Entity() = 0;
|
virtual ~Entity() = 0;
|
||||||
const boost::uuids::uuid& getUuid() const { return uuid_; };
|
const boost::uuids::uuid& getUuid() const { return uuid; };
|
||||||
void createUuid();
|
void createUuid();
|
||||||
void createUuidFromString(const std::string& uuidString);
|
void createUuidFromString(const std::string& uuidString);
|
||||||
State getState();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
boost::uuids::uuid uuid_{};
|
boost::uuids::uuid uuid{};
|
||||||
State state_{State::NEW};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ENTITY_H
|
#endif // ENTITY_H
|
|
@ -2,25 +2,25 @@
|
||||||
|
|
||||||
void Seller::setSellerNo(int seller_no)
|
void Seller::setSellerNo(int seller_no)
|
||||||
{
|
{
|
||||||
sellerNo_ = seller_no;
|
this->sellerNo = seller_no;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Seller::setFirstName(const std::string& firstName)
|
void Seller::setFirstName(const std::string& firstName)
|
||||||
{
|
{
|
||||||
firstName_ = firstName;
|
this->firstName = firstName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Seller::setLastName(const std::string& lastName)
|
void Seller::setLastName(const std::string& lastName)
|
||||||
{
|
{
|
||||||
lastName_ = lastName;
|
this->lastName = lastName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Seller::setNumberOfOfferedArticles(int number)
|
void Seller::setNumberOfOfferedArticles(int number)
|
||||||
{
|
{
|
||||||
numberOfOfferedArticles_ = number;
|
numberOfOfferedArticles = number;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Seller::getNumberOfOfferedArticles()
|
size_t Seller::getNumberOfOfferedArticles()
|
||||||
{
|
{
|
||||||
return articles_.size();
|
return articles.size();
|
||||||
}
|
}
|
|
@ -20,11 +20,11 @@ class Seller : public Entity
|
||||||
size_t getNumberOfOfferedArticles();
|
size_t getNumberOfOfferedArticles();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int sellerNo_{-1};
|
int sellerNo{};
|
||||||
int numberOfOfferedArticles_{};
|
int numberOfOfferedArticles{};
|
||||||
std::string firstName_{};
|
std::string firstName{};
|
||||||
std::string lastName_{};
|
std::string lastName{};
|
||||||
std::vector<Article> articles_{};
|
std::vector<Article> articles{};
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -1,9 +1,9 @@
|
||||||
find_package(Boost COMPONENTS unit_test_framework REQUIRED)
|
find_package(Boost COMPONENTS filesystem unit_test_framework REQUIRED)
|
||||||
|
|
||||||
add_executable(test_seller test_seller.cpp)
|
add_executable(sellertest test_seller.cpp)
|
||||||
target_link_libraries(test_seller core Boost::unit_test_framework)
|
target_link_libraries(sellertest core Boost::boost Boost::filesystem Boost::unit_test_framework)
|
||||||
add_test(Seller ${CMAKE_BINARY_DIR}/bin/test_seller)
|
add_test(Seller ${CMAKE_BINARY_DIR}/bin/sellertest)
|
||||||
|
|
||||||
add_executable(test_database test_database.cpp)
|
add_executable(databasetest test_database.cpp)
|
||||||
target_link_libraries(test_database core Boost::unit_test_framework stdc++fs)
|
target_link_libraries(databasetest core Boost::boost Boost::filesystem Boost::unit_test_framework)
|
||||||
add_test(Database ${CMAKE_BINARY_DIR}/bin/test_database)
|
add_test(Database ${CMAKE_BINARY_DIR}/bin/databasetest)
|
||||||
|
|
|
@ -2,15 +2,10 @@
|
||||||
|
|
||||||
#include "../src/core/database.h"
|
#include "../src/core/database.h"
|
||||||
|
|
||||||
#include <filesystem>
|
|
||||||
|
|
||||||
#include <boost/test/included/unit_test.hpp>
|
#include <boost/test/included/unit_test.hpp>
|
||||||
|
|
||||||
//using namespace boost::unit_test;
|
//using namespace boost::unit_test;
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE( create_database ) {
|
BOOST_AUTO_TEST_CASE( create_database ) {
|
||||||
std::filesystem::path testPath = std::filesystem::temp_directory_path() / "test.db";
|
Database db("test.db");
|
||||||
Database db(testPath.c_str());
|
|
||||||
db.init();
|
|
||||||
std::filesystem::remove(testPath);
|
|
||||||
}
|
}
|
Loading…
Reference in a new issue