shm init
This commit is contained in:
@@ -6,42 +6,68 @@ Date: 19-May-2026
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
#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<std::string, User*> m_users;
|
||||
util::Map<std::string, Service*> m_services;
|
||||
util::Map<std::string, ComboPackage*> m_comboPackages;
|
||||
util::Map<std::string, ServiceBooking*> m_serviceBookings;
|
||||
util::Map<std::string, JobCard*> m_jobCards;
|
||||
util::Map<std::string, InventoryItem*> m_inventoryItems;
|
||||
util::Map<std::string, Invoice*> m_invoices;
|
||||
util::Map<std::string, Payment*> 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<std::string, User*>& getUsers();
|
||||
util::Map<std::string, Service*>& getServices();
|
||||
util::Map<std::string, ComboPackage*>& getComboPackages();
|
||||
util::Map<std::string, ServiceBooking*>& getServiceBookings();
|
||||
util::Map<std::string, JobCard*>& getJobCards();
|
||||
util::Map<std::string, InventoryItem*>& getInventoryItems();
|
||||
util::Map<std::string, Invoice*>& getInvoices();
|
||||
util::Map<std::string, Payment*>& getPayments();
|
||||
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<std::string, TrackedRecord<User>> getUsers();
|
||||
util::Map<std::string, TrackedRecord<Notification>> getNotifications();
|
||||
util::Map<std::string, TrackedRecord<Service>> getServices();
|
||||
util::Map<std::string, TrackedRecord<ComboPackage>> getComboPackages();
|
||||
util::Map<std::string, TrackedRecord<InventoryItem>> getInventoryItems();
|
||||
util::Map<std::string, TrackedRecord<ServiceBooking>> getServiceBookings();
|
||||
util::Map<std::string, TrackedRecord<JobCard>> getJobCards();
|
||||
util::Map<std::string, TrackedRecord<Invoice>> getInvoices();
|
||||
util::Map<std::string, TrackedRecord<Payment>> getPayments();
|
||||
void saveUsers(util::Map<std::string, TrackedRecord<User>>& users);
|
||||
void saveNotifications(util::Map<std::string, TrackedRecord<Notification>>& notifications);
|
||||
void saveServices(util::Map<std::string, TrackedRecord<Service>>& services);
|
||||
void saveComboPackages(util::Map<std::string, TrackedRecord<ComboPackage>>& comboPackages);
|
||||
void saveInventoryItems(util::Map<std::string, TrackedRecord<InventoryItem>>& inventoryItems);
|
||||
void saveServiceBookings(util::Map<std::string, TrackedRecord<ServiceBooking>>& bookings);
|
||||
void saveJobCards(util::Map<std::string, TrackedRecord<JobCard>>& jobCards);
|
||||
void saveInvoices(util::Map<std::string, TrackedRecord<Invoice>>& invoices);
|
||||
void savePayments(util::Map<std::string, TrackedRecord<Payment>>& payments);
|
||||
bool lockDataStore();
|
||||
bool unlockDataStore();
|
||||
private:
|
||||
template<typename TObject, typename TSerialized>
|
||||
util::Map<std::string, TrackedRecord<TObject>> loadRecords(MappingInfo& mapping);
|
||||
template<typename TObject, typename TSerialized>
|
||||
void saveRecords(MappingInfo& mapping, util::Map<std::string, TrackedRecord<TObject>>& records);
|
||||
};
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
#include <cstddef>
|
||||
|
||||
struct FileHeader
|
||||
{
|
||||
size_t recordCount;
|
||||
size_t capacity;
|
||||
};
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
|
||||
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) {}
|
||||
};
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
enum class RecordState : int
|
||||
{
|
||||
CLEAN,
|
||||
NEW_RECORD,
|
||||
MODIFIED,
|
||||
DELETED
|
||||
};
|
||||
+58
@@ -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
|
||||
{
|
||||
|
||||
};
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
#pragma once
|
||||
#include <cstddef>
|
||||
#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);
|
||||
};
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
#pragma once
|
||||
#include "RecordState.h"
|
||||
|
||||
static const size_t INVALID_SLOT = static_cast<size_t>(-1);
|
||||
|
||||
template<typename T>
|
||||
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) {}
|
||||
};
|
||||
@@ -8,6 +8,7 @@ Date: 19-May-2026
|
||||
*/
|
||||
|
||||
#include <sstream>
|
||||
#include "SerializedRecords.h"
|
||||
#include "Service.h"
|
||||
#include "InventoryItem.h"
|
||||
#include "StringHelper.h"
|
||||
@@ -266,61 +267,40 @@ static util::Vector<std::string> 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<std::string> inventoryItemIDs = getInventoryItemIDsAsVector(inventoryItemIDsString);
|
||||
try
|
||||
{
|
||||
laborCost = std::stod(laborCostString);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
throw std::runtime_error("Invalid labor cost");
|
||||
}
|
||||
util::State status = util::getState(statusString);
|
||||
util::Vector<std::string> inventoryItemIDs = getInventoryItemIDsAsVector(serializedService.inventoryItemIDs);
|
||||
return Factory::getObject<Service>(
|
||||
id,
|
||||
name,
|
||||
serializedService.id,
|
||||
serializedService.name,
|
||||
inventoryItemIDs,
|
||||
laborCost,
|
||||
status
|
||||
);
|
||||
serializedService.laborCost,
|
||||
serializedService.status);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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<std::string, InventoryItem*>& 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();
|
||||
};
|
||||
@@ -8,6 +8,7 @@ Date: 19-May-2026
|
||||
*/
|
||||
|
||||
#include <sstream>
|
||||
#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<User>(id,
|
||||
username,
|
||||
password,
|
||||
name,
|
||||
phone,
|
||||
email,
|
||||
userType,
|
||||
status);
|
||||
return Factory::getObject<User>(
|
||||
serializedUser.id,
|
||||
serializedUser.username,
|
||||
serializedUser.password,
|
||||
serializedUser.name,
|
||||
serializedUser.phone,
|
||||
serializedUser.email,
|
||||
serializedUser.userType,
|
||||
serializedUser.status);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user