From 236d5d5c85bb05013f86b8096b85a79d6a58641e Mon Sep 17 00:00:00 2001 From: rtk0c Date: Thu, 3 Jun 2021 10:16:05 -0700 Subject: Rename TransactionsModel to MainDatabase --- core/src/Model/Database.cpp | 163 ++++++++++++++++++++++++++++ core/src/Model/Database.hpp | 80 ++++++++++++++ core/src/Model/Project.hpp | 6 +- core/src/Model/TransactionsModel.cpp | 163 ---------------------------- core/src/Model/TransactionsModel.hpp | 80 -------------- core/src/Model/Workflow/Values/Database.cpp | 2 +- core/src/Model/fwd.hpp | 14 +-- 7 files changed, 254 insertions(+), 254 deletions(-) create mode 100644 core/src/Model/Database.cpp create mode 100644 core/src/Model/Database.hpp delete mode 100644 core/src/Model/TransactionsModel.cpp delete mode 100644 core/src/Model/TransactionsModel.hpp (limited to 'core/src/Model') diff --git a/core/src/Model/Database.cpp b/core/src/Model/Database.cpp new file mode 100644 index 0000000..569b949 --- /dev/null +++ b/core/src/Model/Database.cpp @@ -0,0 +1,163 @@ +#include "Database.hpp" + +#include "Model/Project.hpp" + +#include +#include + +namespace fs = std::filesystem; + +SalesTable::SalesTable(MainDatabase& db) + // language=SQLite + : GetRowCount(db.GetSQLite(), "SELECT Count(*) FROM Sales") + // language=SQLite + , GetRows(db.GetSQLite(), "SELECT * FROM Sales LIMIT ? OFFSET ?") + // language=SQLite + , GetItems(db.GetSQLite(), "SELECT * FROM SalesItems WHERE SaleId == ?") +{ +} + +PurchasesTable::PurchasesTable(MainDatabase& db) + // language=SQLite + : GetRowCount(db.GetSQLite(), "SELECT Count(*) FROM Purchases") + // language=SQLite + , GetRows(db.GetSQLite(), "SELECT * FROM Purchases LIMIT ? OFFSET ?") + // language=SQLite + , GetItems(db.GetSQLite(), "SELECT * FROM PurchasesItems WHERE PurchaseId == ?") +{ +} + +DeliveryTable::DeliveryTable(MainDatabase& db) + // language=SQLite + : FilterByTypeAndId(db.GetSQLite(), "SELECT * FROM Deliveries WHERE AssociatedOrder == ? AND Outgoing = ?") + // language=SQLite + , GetItems(db.GetSQLite(), "SELECT * FROM DeliveriesItems WHERE DeliveryId == ?") +{ +} + +static std::string GetDatabaseFilePath(const Project& project) +{ + auto dbsDir = project.GetPath() / "databases"; + fs::create_directories(dbsDir); + + auto dbFile = dbsDir / "transactions.sqlite3"; + return dbFile.string(); +} + +/// Wrapper for SQLite::Database that creates the default tables +MainDatabase::DatabaseWrapper::DatabaseWrapper(MainDatabase& self) + : mSqlite(GetDatabaseFilePath(*self.mProject), SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE) +{ + // If this table doesn't exist, the database probably just got initialized + if (mSqlite.tableExists("Sales")) { + return; + } + + // 'Sales' schema + // - Customer: the customer item ID + // - Deadline: unix epoch time of order deadline + // - DeliveryTime: the time this order was completed (through a set of deliveries) + + // 'Purchases' schema + // - Factory: the factory id, + // - OrderTime: the time this order was made + // - DeliveryTime: the time this order was completed (through a set of deliveries) + + // 'Deliveries' schema + // - ShipmentTime: unix epoch time stamp of sending to delivery + // - ArrivalTime: unix epoch time stamp of delivery arrived at warehouse; 0 if not arrived yet + // - AssociatedOrder: Id of the order that this delivery is completing (which table: Outgoing=true -> Sales, Outgoing=false -> Purchases) + // - Outgoing: true if the delivery is from warehouse to customer; false if the delivery is from factory to warehouse + + // Note: the 'Id' key would be unique (not recycled after row deletion) because it's explicit + // https://www.sqlite.org/rowidtable.html + + // language=SQLite + mSqlite.exec(R"""( +CREATE TABLE IF NOT EXISTS Sales( + Id INT PRIMARY KEY, + Customer INT, + Deadline DATETIME, + DeliveryTime DATETIME +); +CREATE TABLE IF NOT EXISTS SalesItems( + SaleId INT, + ItemId INT, + Count INT +); + +CREATE TABLE IF NOT EXISTS Purchases( + Id INT PRIMARY KEY, + Factory INT, + OrderTime DATETIME, + DeliveryTime DATETIME +); +CREATE TABLE IF NOT EXISTS PurchasesItems( + PurchaseId INT, + ItemId INT, + Count INT +); + +CREATE TABLE IF NOT EXISTS Deliveries( + Id INT PRIMARY KEY, + ShipmentTime DATETIME, + ArrivalTime DATETIME, + AssociatedOrder INT, + Outgoing BOOLEAN +); +CREATE TABLE IF NOT EXISTS DeliveriesItems( + DeliveryId INT, + ItemId INT, + Count INT +); +)"""); +} + +MainDatabase::MainDatabase(Project& project) + : mProject{ &project } + , mDbWrapper(*this) + , mSales(*this) + , mPurchases(*this) + , mDeliveries(*this) +{ +} + +const SQLite::Database& MainDatabase::GetSQLite() const +{ + return mDbWrapper.mSqlite; +} + +SQLite::Database& MainDatabase::GetSQLite() +{ + return mDbWrapper.mSqlite; +} + +const SalesTable& MainDatabase::GetSales() const +{ + return mSales; +} + +SalesTable& MainDatabase::GetSales() +{ + return mSales; +} + +const PurchasesTable& MainDatabase::GetPurchases() const +{ + return mPurchases; +} + +PurchasesTable& MainDatabase::GetPurchases() +{ + return mPurchases; +} + +const DeliveryTable& MainDatabase::GetDeliveries() const +{ + return mDeliveries; +} + +DeliveryTable& MainDatabase::GetDeliveries() +{ + return mDeliveries; +} diff --git a/core/src/Model/Database.hpp b/core/src/Model/Database.hpp new file mode 100644 index 0000000..90914a0 --- /dev/null +++ b/core/src/Model/Database.hpp @@ -0,0 +1,80 @@ +#pragma once + +#include "cplt_fwd.hpp" + +#include +#include +#include + +enum class TableKind +{ + Sales, + SalesItems, + Purchases, + PurchasesItems, + Deliveries, + DeliveriesItems, +}; + +class SalesTable +{ +public: + SQLite::Statement GetRowCount; + SQLite::Statement GetRows; + SQLite::Statement GetItems; + +public: + SalesTable(MainDatabase& db); +}; + +class PurchasesTable +{ +public: + SQLite::Statement GetRowCount; + SQLite::Statement GetRows; + SQLite::Statement GetItems; + +public: + PurchasesTable(MainDatabase& db); +}; + +class DeliveryTable +{ +public: + SQLite::Statement FilterByTypeAndId; + SQLite::Statement GetItems; + +public: + DeliveryTable(MainDatabase& db); +}; + +// TODO fuck SQLite::Statement has move ctor but not move assignment operator +class MainDatabase +{ +private: + class DatabaseWrapper + { + public: + SQLite::Database mSqlite; + DatabaseWrapper(MainDatabase& self); + }; + + Project* mProject; + DatabaseWrapper mDbWrapper; + SalesTable mSales; + PurchasesTable mPurchases; + DeliveryTable mDeliveries; + +public: + MainDatabase(Project& project); + + const SQLite::Database& GetSQLite() const; + SQLite::Database& GetSQLite(); + + const SalesTable& GetSales() const; + SalesTable& GetSales(); + const PurchasesTable& GetPurchases() const; + PurchasesTable& GetPurchases(); + const DeliveryTable& GetDeliveries() const; + DeliveryTable& GetDeliveries(); +}; diff --git a/core/src/Model/Project.hpp b/core/src/Model/Project.hpp index 1eca09d..c971445 100644 --- a/core/src/Model/Project.hpp +++ b/core/src/Model/Project.hpp @@ -1,8 +1,8 @@ #pragma once +#include "Model/Database.hpp" #include "Model/Items.hpp" #include "Model/Template/Template.hpp" -#include "Model/TransactionsModel.hpp" #include "Model/Workflow/Workflow.hpp" #include @@ -25,9 +25,9 @@ private: std::string mRootPathString; std::string mName; - // This is put after the private fields, so that when TransactionModel's constructor runs, all of them will be initialized + // This is put after the private fields, so that when XxxDatabase's constructor runs, all of them will be initialized public: - TransactionModel Database; + MainDatabase Database; public: /// Load the project from a directory containing the cplt_project.json file. diff --git a/core/src/Model/TransactionsModel.cpp b/core/src/Model/TransactionsModel.cpp deleted file mode 100644 index 7d53f89..0000000 --- a/core/src/Model/TransactionsModel.cpp +++ /dev/null @@ -1,163 +0,0 @@ -#include "TransactionsModel.hpp" - -#include "Model/Project.hpp" - -#include -#include - -namespace fs = std::filesystem; - -SalesTable::SalesTable(TransactionModel& db) - // language=SQLite - : GetRowCount(db.GetSQLite(), "SELECT Count(*) FROM Sales") - // language=SQLite - , GetRows(db.GetSQLite(), "SELECT * FROM Sales LIMIT ? OFFSET ?") - // language=SQLite - , GetItems(db.GetSQLite(), "SELECT * FROM SalesItems WHERE SaleId == ?") -{ -} - -PurchasesTable::PurchasesTable(TransactionModel& db) - // language=SQLite - : GetRowCount(db.GetSQLite(), "SELECT Count(*) FROM Purchases") - // language=SQLite - , GetRows(db.GetSQLite(), "SELECT * FROM Purchases LIMIT ? OFFSET ?") - // language=SQLite - , GetItems(db.GetSQLite(), "SELECT * FROM PurchasesItems WHERE PurchaseId == ?") -{ -} - -DeliveryTable::DeliveryTable(TransactionModel& db) - // language=SQLite - : FilterByTypeAndId(db.GetSQLite(), "SELECT * FROM Deliveries WHERE AssociatedOrder == ? AND Outgoing = ?") - // language=SQLite - , GetItems(db.GetSQLite(), "SELECT * FROM DeliveriesItems WHERE DeliveryId == ?") -{ -} - -static std::string GetDatabaseFilePath(const Project& project) -{ - auto dbsDir = project.GetPath() / "databases"; - fs::create_directories(dbsDir); - - auto dbFile = dbsDir / "transactions.sqlite3"; - return dbFile.string(); -} - -/// Wrapper for SQLite::Database that creates the default tables -TransactionModel::DatabaseWrapper::DatabaseWrapper(TransactionModel& self) - : mSqlite(GetDatabaseFilePath(*self.mProject), SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE) -{ - // If this table doesn't exist, the database probably just got initialized - if (mSqlite.tableExists("Sales")) { - return; - } - - // 'Sales' schema - // - Customer: the customer item ID - // - Deadline: unix epoch time of order deadline - // - DeliveryTime: the time this order was completed (through a set of deliveries) - - // 'Purchases' schema - // - Factory: the factory id, - // - OrderTime: the time this order was made - // - DeliveryTime: the time this order was completed (through a set of deliveries) - - // 'Deliveries' schema - // - ShipmentTime: unix epoch time stamp of sending to delivery - // - ArrivalTime: unix epoch time stamp of delivery arrived at warehouse; 0 if not arrived yet - // - AssociatedOrder: Id of the order that this delivery is completing (which table: Outgoing=true -> Sales, Outgoing=false -> Purchases) - // - Outgoing: true if the delivery is from warehouse to customer; false if the delivery is from factory to warehouse - - // Note: the 'Id' key would be unique (not recycled after row deletion) because it's explicit - // https://www.sqlite.org/rowidtable.html - - // language=SQLite - mSqlite.exec(R"""( -CREATE TABLE IF NOT EXISTS Sales( - Id INT PRIMARY KEY, - Customer INT, - Deadline DATETIME, - DeliveryTime DATETIME -); -CREATE TABLE IF NOT EXISTS SalesItems( - SaleId INT, - ItemId INT, - Count INT -); - -CREATE TABLE IF NOT EXISTS Purchases( - Id INT PRIMARY KEY, - Factory INT, - OrderTime DATETIME, - DeliveryTime DATETIME -); -CREATE TABLE IF NOT EXISTS PurchasesItems( - PurchaseId INT, - ItemId INT, - Count INT -); - -CREATE TABLE IF NOT EXISTS Deliveries( - Id INT PRIMARY KEY, - ShipmentTime DATETIME, - ArrivalTime DATETIME, - AssociatedOrder INT, - Outgoing BOOLEAN -); -CREATE TABLE IF NOT EXISTS DeliveriesItems( - DeliveryId INT, - ItemId INT, - Count INT -); -)"""); -} - -TransactionModel::TransactionModel(Project& project) - : mProject{ &project } - , mDbWrapper(*this) - , mSales(*this) - , mPurchases(*this) - , mDeliveries(*this) -{ -} - -const SQLite::Database& TransactionModel::GetSQLite() const -{ - return mDbWrapper.mSqlite; -} - -SQLite::Database& TransactionModel::GetSQLite() -{ - return mDbWrapper.mSqlite; -} - -const SalesTable& TransactionModel::GetSales() const -{ - return mSales; -} - -SalesTable& TransactionModel::GetSales() -{ - return mSales; -} - -const PurchasesTable& TransactionModel::GetPurchases() const -{ - return mPurchases; -} - -PurchasesTable& TransactionModel::GetPurchases() -{ - return mPurchases; -} - -const DeliveryTable& TransactionModel::GetDeliveries() const -{ - return mDeliveries; -} - -DeliveryTable& TransactionModel::GetDeliveries() -{ - return mDeliveries; -} diff --git a/core/src/Model/TransactionsModel.hpp b/core/src/Model/TransactionsModel.hpp deleted file mode 100644 index c9b33f1..0000000 --- a/core/src/Model/TransactionsModel.hpp +++ /dev/null @@ -1,80 +0,0 @@ -#pragma once - -#include "cplt_fwd.hpp" - -#include -#include -#include - -enum class TableKind -{ - Sales, - SalesItems, - Purchases, - PurchasesItems, - Deliveries, - DeliveriesItems, -}; - -class SalesTable -{ -public: - SQLite::Statement GetRowCount; - SQLite::Statement GetRows; - SQLite::Statement GetItems; - -public: - SalesTable(TransactionModel& db); -}; - -class PurchasesTable -{ -public: - SQLite::Statement GetRowCount; - SQLite::Statement GetRows; - SQLite::Statement GetItems; - -public: - PurchasesTable(TransactionModel& db); -}; - -class DeliveryTable -{ -public: - SQLite::Statement FilterByTypeAndId; - SQLite::Statement GetItems; - -public: - DeliveryTable(TransactionModel& db); -}; - -// TODO fuck SQLite::Statement has move ctor but not move assignment operator -class TransactionModel -{ -private: - class DatabaseWrapper - { - public: - SQLite::Database mSqlite; - DatabaseWrapper(TransactionModel& self); - }; - - Project* mProject; - DatabaseWrapper mDbWrapper; - SalesTable mSales; - PurchasesTable mPurchases; - DeliveryTable mDeliveries; - -public: - TransactionModel(Project& project); - - const SQLite::Database& GetSQLite() const; - SQLite::Database& GetSQLite(); - - const SalesTable& GetSales() const; - SalesTable& GetSales(); - const PurchasesTable& GetPurchases() const; - PurchasesTable& GetPurchases(); - const DeliveryTable& GetDeliveries() const; - DeliveryTable& GetDeliveries(); -}; diff --git a/core/src/Model/Workflow/Values/Database.cpp b/core/src/Model/Workflow/Values/Database.cpp index 12d2b80..cdc2b4f 100644 --- a/core/src/Model/Workflow/Values/Database.cpp +++ b/core/src/Model/Workflow/Values/Database.cpp @@ -1,6 +1,6 @@ #include "Database.hpp" -#include "Model/TransactionsModel.hpp" +#include "Model/Database.hpp" #include "Model/Workflow/ValueInternals.hpp" #include diff --git a/core/src/Model/fwd.hpp b/core/src/Model/fwd.hpp index 8f6fc73..cb7c7dd 100644 --- a/core/src/Model/fwd.hpp +++ b/core/src/Model/fwd.hpp @@ -3,6 +3,13 @@ #include "Model/Template/fwd.hpp" #include "Model/Workflow/fwd.hpp" +// Database.hpp +enum class TableKind; +class SalesTable; +class PurchasesTable; +class DeliveryTable; +class MainDatabase; + // Assets.hpp // Filter.hpp @@ -22,10 +29,3 @@ class CustomerItem; // Project.hpp class Project; - -// TransactionDatabase.hpp -enum class TableKind; -class SalesTable; -class PurchasesTable; -class DeliveryTable; -class TransactionModel; -- cgit v1.2.3-70-g09d2