From ec1f4ea117d4d216acc4fb3a98f026667e689cac Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Wed, 10 Jun 2026 15:42:34 +0530 Subject: [PATCH] shm init --- .../datastores/DataStore.h | 70 +++++++++++++------ .../datastores/sharedmemory/FileHeader.h | 8 +++ .../datastores/sharedmemory/MappingInfo.h | 19 +++++ .../datastores/sharedmemory/RecordState.h | 9 +++ .../sharedmemory/SerializedRecords.h | 58 +++++++++++++++ .../datastores/sharedmemory/SharedMemory.cpp | 0 .../datastores/sharedmemory/SharedMemory.h | 19 +++++ .../datastores/sharedmemory/TrackedRecord.h | 23 ++++++ .../models/Service.cpp | 58 +++++---------- .../models/Service.h | 5 +- .../models/User.cpp | 63 +++++++---------- .../models/User.h | 5 +- .../utilities/Enums.h | 10 +-- 13 files changed, 240 insertions(+), 107 deletions(-) create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/FileHeader.h create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/MappingInfo.h create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/RecordState.h create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SerializedRecords.h create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.h create mode 100644 Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/TrackedRecord.h diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h index cde9b4e..26b3e21 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h @@ -6,42 +6,68 @@ Date: 19-May-2026 */ #pragma once +#include #include #include "Map.h" - +#include "MappingInfo.h" +#include "TrackedRecord.h" +#include "SharedMemory.h" class User; +class Notification; class Service; class ComboPackage; +class InventoryItem; class ServiceBooking; class JobCard; -class InventoryItem; class Invoice; class Payment; class DataStore { private: - util::Map m_users; - util::Map m_services; - util::Map m_comboPackages; - util::Map m_serviceBookings; - util::Map m_jobCards; - util::Map m_inventoryItems; - util::Map m_invoices; - util::Map m_payments; - DataStore() {} -public: - static DataStore& getInstance(); + DataStore(); DataStore(const DataStore&) = delete; DataStore& operator=(const DataStore&) = delete; DataStore(DataStore&&) = delete; DataStore& operator=(DataStore&&) = delete; - util::Map& getUsers(); - util::Map& getServices(); - util::Map& getComboPackages(); - util::Map& getServiceBookings(); - util::Map& getJobCards(); - util::Map& getInventoryItems(); - util::Map& getInvoices(); - util::Map& getPayments(); -}; \ No newline at end of file + bool unlockMutex(); + HANDLE m_globalMutex; + MappingInfo m_users; + MappingInfo m_notifications; + MappingInfo m_services; + MappingInfo m_comboPackages; + MappingInfo m_inventoryItems; + MappingInfo m_serviceBookings; + MappingInfo m_jobCards; + MappingInfo m_invoices; + MappingInfo m_payments; +public: + static DataStore& getInstance(); + bool initialize(); + void shutdown(); + util::Map> getUsers(); + util::Map> getNotifications(); + util::Map> getServices(); + util::Map> getComboPackages(); + util::Map> getInventoryItems(); + util::Map> getServiceBookings(); + util::Map> getJobCards(); + util::Map> getInvoices(); + util::Map> getPayments(); + void saveUsers(util::Map>& users); + void saveNotifications(util::Map>& notifications); + void saveServices(util::Map>& services); + void saveComboPackages(util::Map>& comboPackages); + void saveInventoryItems(util::Map>& inventoryItems); + void saveServiceBookings(util::Map>& bookings); + void saveJobCards(util::Map>& jobCards); + void saveInvoices(util::Map>& invoices); + void savePayments(util::Map>& payments); + bool lockDataStore(); + bool unlockDataStore(); +private: + template + util::Map> loadRecords(MappingInfo& mapping); + template + void saveRecords(MappingInfo& mapping, util::Map>& records); +}; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/FileHeader.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/FileHeader.h new file mode 100644 index 0000000..5d0a875 --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/FileHeader.h @@ -0,0 +1,8 @@ +#pragma once +#include + +struct FileHeader +{ + size_t recordCount; + size_t capacity; +}; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/MappingInfo.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/MappingInfo.h new file mode 100644 index 0000000..7b0baed --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/MappingInfo.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include + +struct MappingInfo +{ + HANDLE fileHandle; + HANDLE mappingHandle; + void* mappedView; + std::string fileName; + size_t recordSize; + size_t mappedCapacity; + MappingInfo() + : fileHandle(NULL), + mappingHandle(NULL), + mappedView(nullptr), + recordSize(0), + mappedCapacity(0) {} +}; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/RecordState.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/RecordState.h new file mode 100644 index 0000000..f6487cd --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/RecordState.h @@ -0,0 +1,9 @@ +#pragma once + +enum class RecordState : int +{ + CLEAN, + NEW_RECORD, + MODIFIED, + DELETED +}; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SerializedRecords.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SerializedRecords.h new file mode 100644 index 0000000..da615e9 --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SerializedRecords.h @@ -0,0 +1,58 @@ +#pragma once +#include "Utility.h" + +struct SerializedUser +{ + char id[64]; + char username[64]; + char password[64]; + char name[128]; + char phone[32]; + char email[128]; + util::UserType userType; + util::State status; +}; + +struct SerializedNotification +{ + +}; + +struct SerializedService +{ + char id[64]; + char name[128]; + char inventoryItemIDs[1024]; + double laborCost; + util::State status; +}; + +struct SerializedComboPackage +{ + +}; + +struct SerializedInventoryItem +{ + +}; + +struct SerializedServiceBooking +{ + +}; + +struct SerializedJobCard +{ + +}; + +struct SerializedInvoice +{ + +}; + +struct SerializedPayment +{ + +}; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp new file mode 100644 index 0000000..e69de29 diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.h new file mode 100644 index 0000000..ed76b62 --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.h @@ -0,0 +1,19 @@ +#pragma once +#include +#include "MappingInfo.h" +#include "FileHeader.h" + +namespace SharedMemory +{ + bool createOrOpenMapping(MappingInfo& mapping); + void closeMapping(MappingInfo& mapping); + bool ensureLatestMapping(MappingInfo& mapping); + bool resizeMapping(MappingInfo& mapping, size_t newCapacity); + FileHeader* getHeader(MappingInfo& mapping); + void* getRecordAddress(MappingInfo& mapping, size_t index); + size_t getRecordCount(MappingInfo& mapping); + void setRecordCount(MappingInfo& mapping, size_t count); + size_t getCapacity(MappingInfo& mapping); + bool ensureCapacityForInsert(MappingInfo& mapping); + bool shrinkIfNeeded(MappingInfo& mapping); +}; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/TrackedRecord.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/TrackedRecord.h new file mode 100644 index 0000000..156b815 --- /dev/null +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/TrackedRecord.h @@ -0,0 +1,23 @@ +#pragma once +#include "RecordState.h" + +static const size_t INVALID_SLOT = static_cast(-1); + +template +struct TrackedRecord +{ + T* data; + RecordState state; + size_t slotIndex; + TrackedRecord() + : data(nullptr), + state(RecordState::CLEAN), + slotIndex(INVALID_SLOT) {} + TrackedRecord( + T* object, + RecordState recordState, + size_t slot) + : data(object), + state(recordState), + slotIndex(slot) {} +}; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp index 0717467..23acabd 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.cpp @@ -8,6 +8,7 @@ Date: 19-May-2026 */ #include +#include "SerializedRecords.h" #include "Service.h" #include "InventoryItem.h" #include "StringHelper.h" @@ -266,61 +267,40 @@ static util::Vector getInventoryItemIDsAsVector(const std::string& /* Function: serialize -Description: Serializes the service into a CSV-formatted string. +Description: Serializes the Service object into a SerializedService record. Parameters: - None Returns: - - std::string: Serialized service record + - SerializedService: Serialized representation of the service */ -std::string Service::serialize() const +SerializedService Service::serialize() const { - std::ostringstream serializedService; - serializedService << m_id << ',' - << m_name << ',' - << getInventoryItemIDsAsString(m_requiredInventoryItemIDs) << ',' - << m_laborCost << ',' - << util::getStateString(m_status); - return serializedService.str(); + SerializedService serialized = {}; + strcpy_s(serialized.id, sizeof(serialized.id), m_id.c_str()); + strcpy_s(serialized.name, sizeof(serialized.name), m_name.c_str()); + strcpy_s(serialized.inventoryItemIDs, sizeof(serialized.inventoryItemIDs), getInventoryItemIDsAsString(m_requiredInventoryItemIDs).c_str()); + serialized.laborCost = m_laborCost; + serialized.status = m_status; + return serialized; } /* Function: deserialize -Description: Deserializes a CSV-formatted string into a Service object. +Description: Deserializes a SerializedService record into a Service object. Parameters: - - record: const std::string&, serialized service record + - serializedService: const SerializedService&, serialized service record Returns: - Service*: Pointer to the deserialized Service object -Throws: - - std::runtime_error if labor cost parsing fails */ -Service* Service::deserialize(const std::string& record) +Service* Service::deserialize(const SerializedService& serializedService) { - std::string id, name; - std::string inventoryItemIDsString, laborCostString, statusString; - double laborCost; - std::istringstream serializedService(record); - getline(serializedService, id, ','); - getline(serializedService, name, ','); - getline(serializedService, inventoryItemIDsString, ','); - getline(serializedService, laborCostString, ','); - getline(serializedService, statusString, ','); - util::Vector inventoryItemIDs = getInventoryItemIDsAsVector(inventoryItemIDsString); - try - { - laborCost = std::stod(laborCostString); - } - catch (...) - { - throw std::runtime_error("Invalid labor cost"); - } - util::State status = util::getState(statusString); + util::Vector inventoryItemIDs = getInventoryItemIDsAsVector(serializedService.inventoryItemIDs); return Factory::getObject( - id, - name, + serializedService.id, + serializedService.name, inventoryItemIDs, - laborCost, - status - ); + serializedService.laborCost, + serializedService.status); } /* diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h index b80e674..9a71b4f 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Service.h @@ -14,6 +14,7 @@ Date: 19-May-2026 #include "Enums.h" class InventoryItem; +struct SerializedService; class Service { @@ -40,7 +41,7 @@ public: void setRequiredInventoryItems(const util::Map& requiredInventoryItems); void setLaborCost(double laborCost); void setState(util::State status); - std::string serialize() const; - static Service* deserialize(const std::string&); + SerializedService serialize() const; + static Service* deserialize(const SerializedService&); static std::string getHeaders(); }; \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp index 0b4e86e..0d3e81b 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp @@ -8,6 +8,7 @@ Date: 19-May-2026 */ #include +#include "SerializedRecords.h" #include "User.h" #include "Notification.h" #include "Enums.h" @@ -324,57 +325,45 @@ void User::setState(util::State status) /* Function: serialize -Description: Serializes the user into a CSV-formatted string. +Description: Serializes the User object into a SerializedUser record. Parameters: - None Returns: - - std::string: Serialized user record + - SerializedUser: Serialized representation of the user */ -std::string User::serialize() const +SerializedUser User::serialize() const { - std::ostringstream serializedUser; - serializedUser << m_id << ',' - << m_userName << ',' - << m_password << ',' - << m_name << ',' - << m_phone << ',' - << m_email << ',' - << util::getUserTypeString(m_type) << ',' - << util::getStateString(m_status); - return serializedUser.str(); + SerializedUser serialized = {}; + strcpy_s(serialized.id, sizeof(serialized.id), m_id.c_str()); + strcpy_s(serialized.username, sizeof(serialized.username), m_userName.c_str()); + strcpy_s(serialized.password, sizeof(serialized.password), m_password.c_str()); + strcpy_s(serialized.name, sizeof(serialized.name), m_name.c_str()); + strcpy_s(serialized.phone, sizeof(serialized.phone), m_phone.c_str()); + strcpy_s(serialized.email, sizeof(serialized.email), m_email.c_str()); + serialized.userType = m_type; + serialized.status = m_status; + return serialized; } /* Function: deserialize -Description: Deserializes a CSV-formatted string into a User object. +Description: Deserializes a SerializedUser record into a User object. Parameters: - - record: const std::string&, serialized user record + - serializedUser: const SerializedUser&, serialized user record Returns: - User*: Pointer to the deserialized User object */ -User* User::deserialize(const std::string& record) +User* User::deserialize(const SerializedUser& serializedUser) { - std::string id, name, username, phone, password, email; - std::string userTypeString, stateString; - std::istringstream serializedUser(record); - getline(serializedUser, id, ','); - getline(serializedUser, username, ','); - getline(serializedUser, password, ','); - getline(serializedUser, name, ','); - getline(serializedUser, phone, ','); - getline(serializedUser, email, ','); - getline(serializedUser, userTypeString, ','); - getline(serializedUser, stateString); - util::UserType userType = util::getUserType(userTypeString); - util::State status = util::getState(stateString); - return Factory::getObject(id, - username, - password, - name, - phone, - email, - userType, - status); + return Factory::getObject( + serializedUser.id, + serializedUser.username, + serializedUser.password, + serializedUser.name, + serializedUser.phone, + serializedUser.email, + serializedUser.userType, + serializedUser.status); } /* diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h index 12923f6..2b18bd3 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h @@ -14,6 +14,7 @@ Date: 19-May-2026 #include "Enums.h" class Notification; +struct SerializedUser; class User : public Observer { @@ -51,7 +52,7 @@ public: void addNotification(Notification* notification) override; void setRole(util::UserType role); void setState(util::State status); - std::string serialize() const; - static User* deserialize(const std::string&); + SerializedUser serialize() const; + static User* deserialize(const SerializedUser& serializedUser); static std::string getHeaders(); }; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h index 7585abc..b908f51 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Enums.h @@ -12,28 +12,28 @@ Date: 19-May-2026 namespace util { - enum class UserType + enum class UserType : int { ADMIN, TECHNICIAN, CUSTOMER }; - enum class PaymentMode + enum class PaymentMode : int { ONLINE, OFFLINE, NOTSET }; - enum class PaymentStatus + enum class PaymentStatus : int { PENDING, COMPLETED, PAID }; - enum class ServiceJobStatus + enum class ServiceJobStatus : int { PENDING, STARTED, @@ -42,7 +42,7 @@ namespace util CANCELLED }; - enum class State + enum class State : int { ACTIVE, INACTIVE