|
|
|
@ -75,11 +75,10 @@ void Database::createNew()
|
|
|
|
|
|
|
|
|
|
std::string sqlCreateKima2{"CREATE TABLE IF NOT EXISTS kima2 ("
|
|
|
|
|
"version INTEGER NOT NULL);"
|
|
|
|
|
"INSERT INTO kima2 (version) VALUES (2);"};
|
|
|
|
|
"INSERT INTO kima2 (version) VALUES (3);"};
|
|
|
|
|
sqlStrings.push_back(sqlCreateKima2);
|
|
|
|
|
std::string sqlCreateSellers{"CREATE TABLE IF NOT EXISTS sellers ("
|
|
|
|
|
"id TEXT PRIMARY KEY NOT NULL, "
|
|
|
|
|
"seller_no INTEGER, "
|
|
|
|
|
"seller_no INTEGER PRIMARY KEY NOT NULL, "
|
|
|
|
|
"first_name TEXT, "
|
|
|
|
|
"last_name TEXT, "
|
|
|
|
|
"num_offered_articles INTEGER, "
|
|
|
|
@ -89,13 +88,13 @@ void Database::createNew()
|
|
|
|
|
std::string sqlCreateArticles{
|
|
|
|
|
"CREATE TABLE IF NOT EXISTS articles ("
|
|
|
|
|
"id TEXT PRIMARY KEY NOT NULL, "
|
|
|
|
|
"seller_id TEXT NOT NULL, "
|
|
|
|
|
"seller_no 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, "
|
|
|
|
|
"FOREIGN KEY (seller_no) REFERENCES sellers(seller_no) ON DELETE CASCADE, "
|
|
|
|
|
"CHECK (article_no BETWEEN 0 AND 99999)"
|
|
|
|
|
");"};
|
|
|
|
|
sqlStrings.push_back(sqlCreateArticles);
|
|
|
|
@ -115,9 +114,9 @@ void Database::createNew()
|
|
|
|
|
sqlStrings.push_back(sqlCreateSalesItems);
|
|
|
|
|
|
|
|
|
|
std::string sqlInitialEntries{
|
|
|
|
|
"INSERT OR IGNORE INTO sellers (id, seller_no, first_name, last_name, "
|
|
|
|
|
"INSERT OR IGNORE INTO sellers (seller_no, first_name, last_name, "
|
|
|
|
|
"num_offered_articles) VALUES "
|
|
|
|
|
"('11111111-1111-1111-1111-111111111111', 0, 'Sonderkonto', 'Sonderkonto', 0)"};
|
|
|
|
|
"(0, 'Sonderkonto', 'Sonderkonto', 0)"};
|
|
|
|
|
sqlStrings.push_back(sqlInitialEntries);
|
|
|
|
|
|
|
|
|
|
beginTransaction();
|
|
|
|
@ -130,13 +129,18 @@ void Database::createNew()
|
|
|
|
|
void Database::updateDbToVer2()
|
|
|
|
|
{
|
|
|
|
|
beginTransaction();
|
|
|
|
|
exec("INSERT OR IGNORE INTO sellers (id, seller_no, first_name, last_name, "
|
|
|
|
|
exec("INSERT OR IGNORE INTO sellers (seller_no, first_name, last_name, "
|
|
|
|
|
"num_offered_articles) VALUES "
|
|
|
|
|
"('11111111-1111-1111-1111-111111111111', 0, 'Sonderkonto', 'Sonderkonto', 0)");
|
|
|
|
|
exec("UPDATE kima2 SET version = 2");
|
|
|
|
|
"(0, 'Sonderkonto', 'Sonderkonto', 0)");
|
|
|
|
|
exec("UPDATE kima2 SET version = 3");
|
|
|
|
|
endTransaction();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Database::updateDbToVer3()
|
|
|
|
|
{
|
|
|
|
|
newDb();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Database::init()
|
|
|
|
|
{
|
|
|
|
|
const int errCode = sqlite3_open(dbname_.c_str(), &db_);
|
|
|
|
@ -154,7 +158,10 @@ void Database::init()
|
|
|
|
|
createNew();
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
updateDbToVer2();
|
|
|
|
|
updateDbToVer3();
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
updateDbToVer3();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
// Do nothing because we are up-to-date.
|
|
|
|
@ -225,16 +232,13 @@ unsigned int Database::storeSellers(std::vector<std::unique_ptr<Seller>>& seller
|
|
|
|
|
retCode = sqlite3_prepare_v2(
|
|
|
|
|
db_,
|
|
|
|
|
"INSERT INTO sellers"
|
|
|
|
|
" (id, seller_no, first_name, last_name, num_offered_articles)"
|
|
|
|
|
" VALUES (:uuid, :seller_no, :first_name, :last_name, :num_offered_articles)",
|
|
|
|
|
" (seller_no, first_name, last_name, num_offered_articles)"
|
|
|
|
|
" VALUES (:seller_no, :first_name, :last_name, :num_offered_articles)",
|
|
|
|
|
-1, &stmt, nullptr);
|
|
|
|
|
|
|
|
|
|
if (retCode != SQLITE_OK)
|
|
|
|
|
throw std::runtime_error(sqlite3_errmsg(db_));
|
|
|
|
|
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":uuid"),
|
|
|
|
|
boost::uuids::to_string(seller->getUuid()).c_str(), -1,
|
|
|
|
|
SQLITE_TRANSIENT);
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":seller_no"),
|
|
|
|
|
seller->getSellerNo());
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":first_name"),
|
|
|
|
@ -260,15 +264,14 @@ unsigned int Database::storeSellers(std::vector<std::unique_ptr<Seller>>& seller
|
|
|
|
|
"UPDATE sellers SET"
|
|
|
|
|
" seller_no = :seller_no, first_name = :first_name,"
|
|
|
|
|
" last_name = :last_name, num_offered_articles = :num_offered_articles"
|
|
|
|
|
" WHERE id = :uuid",
|
|
|
|
|
" WHERE seller_no = :id",
|
|
|
|
|
-1, &stmt, nullptr);
|
|
|
|
|
|
|
|
|
|
if (retCode != SQLITE_OK)
|
|
|
|
|
throw std::runtime_error(sqlite3_errmsg(db_));
|
|
|
|
|
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":uuid"),
|
|
|
|
|
boost::uuids::to_string(seller->getUuid()).c_str(), -1,
|
|
|
|
|
SQLITE_TRANSIENT);
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":id"),
|
|
|
|
|
seller->getId());
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":seller_no"),
|
|
|
|
|
seller->getSellerNo());
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":first_name"),
|
|
|
|
@ -292,14 +295,13 @@ unsigned int Database::storeSellers(std::vector<std::unique_ptr<Seller>>& seller
|
|
|
|
|
count += static_cast<int>(seller->getArticles(false).size());
|
|
|
|
|
|
|
|
|
|
retCode =
|
|
|
|
|
sqlite3_prepare_v2(db_, "DELETE FROM sellers WHERE id = :uuid", -1, &stmt, nullptr);
|
|
|
|
|
sqlite3_prepare_v2(db_, "DELETE FROM sellers WHERE seller_no = :id", -1, &stmt, nullptr);
|
|
|
|
|
|
|
|
|
|
if (retCode != SQLITE_OK)
|
|
|
|
|
throw std::runtime_error(sqlite3_errmsg(db_));
|
|
|
|
|
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":uuid"),
|
|
|
|
|
boost::uuids::to_string(seller->getUuid()).c_str(), -1,
|
|
|
|
|
SQLITE_TRANSIENT);
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":id"),
|
|
|
|
|
seller->getId());
|
|
|
|
|
|
|
|
|
|
retCode = sqlite3_step(stmt);
|
|
|
|
|
|
|
|
|
@ -346,7 +348,7 @@ unsigned int Database::storeArticles(std::vector<Article*> articles)
|
|
|
|
|
retCode = sqlite3_prepare_v2(
|
|
|
|
|
db_,
|
|
|
|
|
"INSERT INTO articles"
|
|
|
|
|
" (id, seller_id, source_no, article_no, description, price)"
|
|
|
|
|
" (id, seller_no, source_no, article_no, description, price)"
|
|
|
|
|
" VALUES (:uuid, :seller_id, :source_no, :article_no, :desc, :price)",
|
|
|
|
|
-1, &stmt, nullptr);
|
|
|
|
|
|
|
|
|
@ -356,9 +358,8 @@ unsigned int Database::storeArticles(std::vector<Article*> articles)
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":uuid"),
|
|
|
|
|
boost::uuids::to_string(article->getUuid()).c_str(), -1,
|
|
|
|
|
SQLITE_TRANSIENT);
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":seller_id"),
|
|
|
|
|
boost::uuids::to_string(article->getSeller()->getUuid()).c_str(), -1,
|
|
|
|
|
SQLITE_TRANSIENT);
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":seller_id"),
|
|
|
|
|
article->getSeller()->getId());
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":source_no"),
|
|
|
|
|
article->getSourceNo());
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":article_no"),
|
|
|
|
@ -382,7 +383,7 @@ unsigned int Database::storeArticles(std::vector<Article*> articles)
|
|
|
|
|
retCode = sqlite3_prepare_v2(
|
|
|
|
|
db_,
|
|
|
|
|
"UPDATE articles SET"
|
|
|
|
|
" seller_id = seller_id, source_no = :source_no, article_no = :article_no,"
|
|
|
|
|
" seller_no = :seller_id, source_no = :source_no, article_no = :article_no,"
|
|
|
|
|
" description = :desc, price = :price"
|
|
|
|
|
" WHERE id = :uuid",
|
|
|
|
|
-1, &stmt, nullptr);
|
|
|
|
@ -393,9 +394,8 @@ unsigned int Database::storeArticles(std::vector<Article*> articles)
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":uuid"),
|
|
|
|
|
boost::uuids::to_string(article->getUuid()).c_str(), -1,
|
|
|
|
|
SQLITE_TRANSIENT);
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":seller_id"),
|
|
|
|
|
boost::uuids::to_string(article->getSeller()->getUuid()).c_str(), -1,
|
|
|
|
|
SQLITE_TRANSIENT);
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":seller_id"),
|
|
|
|
|
article->getSeller()->getId());
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":source_no"),
|
|
|
|
|
article->getSourceNo());
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":article_no"),
|
|
|
|
@ -553,7 +553,7 @@ unsigned int Database::loadSellers(std::vector<std::unique_ptr<Seller>>& sellers
|
|
|
|
|
sqlite3_stmt* stmt;
|
|
|
|
|
|
|
|
|
|
retCode = sqlite3_prepare_v2(db_,
|
|
|
|
|
"SELECT id, seller_no, first_name, last_name, "
|
|
|
|
|
"SELECT seller_no, first_name, last_name, "
|
|
|
|
|
"num_offered_articles FROM sellers ORDER BY seller_no",
|
|
|
|
|
-1, &stmt, nullptr);
|
|
|
|
|
if (retCode != SQLITE_OK)
|
|
|
|
@ -566,11 +566,10 @@ unsigned int Database::loadSellers(std::vector<std::unique_ptr<Seller>>& sellers
|
|
|
|
|
while (retCode != SQLITE_DONE) {
|
|
|
|
|
++count;
|
|
|
|
|
auto seller = std::make_unique<Seller>();
|
|
|
|
|
seller->setUuidFromString(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 0)));
|
|
|
|
|
seller->setSellerNo(sqlite3_column_int(stmt, 1));
|
|
|
|
|
seller->setFirstName(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 2)));
|
|
|
|
|
seller->setLastName(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 3)));
|
|
|
|
|
seller->setNumArticlesOffered(sqlite3_column_int(stmt, 4));
|
|
|
|
|
seller->setSellerNo(sqlite3_column_int(stmt, 0));
|
|
|
|
|
seller->setFirstName(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1)));
|
|
|
|
|
seller->setLastName(reinterpret_cast<const char*>(sqlite3_column_text(stmt, 2)));
|
|
|
|
|
seller->setNumArticlesOffered(sqlite3_column_int(stmt, 3));
|
|
|
|
|
seller->setState(Seller::State::OK);
|
|
|
|
|
sellers.push_back(std::move(seller));
|
|
|
|
|
|
|
|
|
@ -583,14 +582,14 @@ unsigned int Database::loadSellers(std::vector<std::unique_ptr<Seller>>& sellers
|
|
|
|
|
retCode = sqlite3_prepare_v2(db_,
|
|
|
|
|
"SELECT id, source_no, article_no, description, price"
|
|
|
|
|
" FROM articles"
|
|
|
|
|
" WHERE seller_id = :seller_uuid"
|
|
|
|
|
" WHERE seller_no = :seller_id"
|
|
|
|
|
" ORDER BY article_no",
|
|
|
|
|
-1, &stmt, nullptr);
|
|
|
|
|
if (retCode != SQLITE_OK)
|
|
|
|
|
throw std::runtime_error(sqlite3_errmsg(db_));
|
|
|
|
|
|
|
|
|
|
sqlite3_bind_text(stmt, sqlite3_bind_parameter_index(stmt, ":seller_uuid"),
|
|
|
|
|
boost::uuids::to_string(seller->getUuid()).c_str(), -1, SQLITE_TRANSIENT);
|
|
|
|
|
sqlite3_bind_int(stmt, sqlite3_bind_parameter_index(stmt, ":seller_id"),
|
|
|
|
|
seller->getId());
|
|
|
|
|
|
|
|
|
|
retCode = sqlite3_step(stmt);
|
|
|
|
|
|
|
|
|
@ -746,4 +745,4 @@ void Database::updateCashPointNo(int oldCashPointNo, int newCashPointNo)
|
|
|
|
|
sqlite3_finalize(stmt);
|
|
|
|
|
|
|
|
|
|
endTransaction();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|