create db with sellers and articles

This commit is contained in:
Martin Brodbeck 2018-07-10 14:12:37 +02:00
parent 79d96c22bc
commit 9705426c31
4 changed files with 51 additions and 8 deletions

View file

@ -1,25 +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::init()
{
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::beginTransaction() { exec("BEGIN TRANSACTION"); } void Database::beginTransaction() { exec("BEGIN TRANSACTION"); }
void Database::endTransaction() { 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

@ -1,9 +1,9 @@
find_package(Boost COMPONENTS filesystem unit_test_framework REQUIRED) find_package(Boost COMPONENTS unit_test_framework REQUIRED)
add_executable(test_seller test_seller.cpp) add_executable(test_seller test_seller.cpp)
target_link_libraries(test_seller core Boost::unit_test_framework) target_link_libraries(test_seller core Boost::unit_test_framework)
add_test(Seller ${CMAKE_BINARY_DIR}/bin/test_seller) add_test(Seller ${CMAKE_BINARY_DIR}/bin/test_seller)
add_executable(test_database test_database.cpp) add_executable(test_database test_database.cpp)
target_link_libraries(test_database core 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/test_database) 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);
} }