Compare commits

...

4 commits

Author SHA1 Message Date
9705426c31 create db with sellers and articles 2018-07-10 14:12:37 +02:00
79d96c22bc transactions 2018-07-10 12:51:23 +02:00
af72567bf7 tests renamed 2018-07-10 12:51:15 +02:00
be9c951d02 more work on entities 2018-07-10 12:51:03 +02:00
8 changed files with 79 additions and 36 deletions

View file

@ -1,31 +1,62 @@
#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::beginTransaction() void Database::init()
{ {
exec("BEGIN TRANSACTION"); std::string sqlCreateSellers{
"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::endTransaction() void Database::beginTransaction() { exec("BEGIN TRANSACTION"); }
{
exec("END TRANSACTION"); void Database::endTransaction() { exec("END TRANSACTION"); }
}

View file

@ -13,8 +13,9 @@ 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();
}; };

View file

@ -5,18 +5,21 @@
#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_;
} }

View file

@ -8,14 +8,17 @@
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

View file

@ -2,25 +2,25 @@
void Seller::setSellerNo(int seller_no) void Seller::setSellerNo(int seller_no)
{ {
this->sellerNo = seller_no; sellerNo_ = seller_no;
} }
void Seller::setFirstName(const std::string& firstName) void Seller::setFirstName(const std::string& firstName)
{ {
this->firstName = firstName; firstName_ = firstName;
} }
void Seller::setLastName(const std::string& lastName) void Seller::setLastName(const std::string& lastName)
{ {
this->lastName = lastName; 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();
} }

View file

@ -20,11 +20,11 @@ class Seller : public Entity
size_t getNumberOfOfferedArticles(); size_t getNumberOfOfferedArticles();
private: private:
int sellerNo{}; int sellerNo_{-1};
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

View file

@ -1,9 +1,9 @@
find_package(Boost COMPONENTS filesystem unit_test_framework REQUIRED) find_package(Boost COMPONENTS unit_test_framework REQUIRED)
add_executable(sellertest test_seller.cpp) add_executable(test_seller test_seller.cpp)
target_link_libraries(sellertest core Boost::boost Boost::filesystem Boost::unit_test_framework) target_link_libraries(test_seller core Boost::unit_test_framework)
add_test(Seller ${CMAKE_BINARY_DIR}/bin/sellertest) add_test(Seller ${CMAKE_BINARY_DIR}/bin/test_seller)
add_executable(databasetest test_database.cpp) add_executable(test_database test_database.cpp)
target_link_libraries(databasetest core Boost::boost Boost::filesystem Boost::unit_test_framework) target_link_libraries(test_database core Boost::unit_test_framework stdc++fs)
add_test(Database ${CMAKE_BINARY_DIR}/bin/databasetest) add_test(Database ${CMAKE_BINARY_DIR}/bin/test_database)

View file

@ -2,10 +2,15 @@
#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 ) {
Database db("test.db"); std::filesystem::path testPath = std::filesystem::temp_directory_path() / "test.db";
Database db(testPath.c_str());
db.init();
std::filesystem::remove(testPath);
} }