Compare commits

..

2 Commits

Author SHA1 Message Date
joelthomastrenser 4f9b92639e Implement Model Refactoring
<UserStory> 1959: Model Refactoring </UserStory>

UserStory #1959

<Changes>
1. Replaced CSV-based User serialization and deserialization with SerializedUser record-based serialization for shared memory storage.
2. Implemented User::serialize() to convert User objects into fixed-size SerializedUser structures containing user details and enum values.
3. Implemented User::deserialize() to reconstruct User objects directly from SerializedUser records.
4. Updated User class interfaces to use SerializedUser types instead of std::string serialization APIs.
5. Removed legacy CSV serialization support, including CSV parsing logic and header generation functionality.
6. Added SerializedUser dependencies through SerializedRecords.h inclusion and forward declaration support.
</Changes>

<Test>
N/A
</Test>

<Review>
Sreeja Reghukumar, please review
</Review>
2026-06-11 19:59:10 +05:30
joelthomastrenser e5787dfb98 Impelement datastore shared memory codebase
Changes:
- Added SharedMemory module for file-backed memory-mapped storage
- Added MappingInfo, FileHeader, RecordState and TrackedRecord infrastructure
- Replaced CSV-based serialization with binary struct serialization
- Added DataStore initialization and shutdown lifecycle management
- Added datastore mutex synchronization for multi-process access
- Added shared-memory mapping configuration for all datastore entities
- Added generic loadRecords and saveRecords template infrastructure
- Added automatic datastore directory creation and .dat file storage
- Updated configuration to use binary datastore files and initial capacities
- Added enum underlying types for serialization compatibility
- Added password masking support for login, registration and password change flows
- Added Visual Studio project configuration for shared-memory components
- Prepared datastore for multi-process shared-memory persistence
2026-06-11 19:07:03 +05:30
2 changed files with 104 additions and 155 deletions
@@ -13,42 +13,9 @@ Date: 19-May-2026
#include "SerializedRecords.h"
#include "FileHelper.h"
/*
Function: DataStore
Description: Constructs the DataStore singleton and initializes
internal handles to their default values.
Parameters:
- None
Returns:
- None
*/
DataStore::DataStore() :
m_globalMutex(NULL) {}
/*
Function: ~DataStore
Description: Destroys the DataStore singleton and releases all
cached application objects owned by the datastore.
This includes users, notifications, services,
combo packages, inventory items, service bookings,
job cards, and invoices.
Parameters:
- None
Returns:
- None
*/
DataStore::~DataStore()
{
clearCache(m_userCache);
clearCache(m_notificationCache);
clearCache(m_serviceCache);
clearCache(m_comboPackageCache);
clearCache(m_inventoryItemCache);
clearCache(m_serviceBookingCache);
clearCache(m_jobCardCache);
clearCache(m_invoiceCache);
}
/*
Function: initialize
Description: Initializes the shared-memory datastore.
@@ -226,9 +193,9 @@ Parameters:
Returns:
- util::Map<std::string, TrackedRecord<User>>: Collection of user records
*/
util::Map<std::string, TrackedRecord<User>>& DataStore::getUsers()
util::Map<std::string, TrackedRecord<User>> DataStore::getUsers()
{
return m_userCache;
return util::Map<std::string, TrackedRecord<User>>();
}
/*
@@ -239,9 +206,9 @@ Parameters:
Returns:
- util::Map<std::string, TrackedRecord<Notification>>: Collection of notification records
*/
util::Map<std::string, TrackedRecord<Notification>>& DataStore::getNotifications()
util::Map<std::string, TrackedRecord<Notification>> DataStore::getNotifications()
{
return m_notificationCache;
return util::Map<std::string, TrackedRecord<Notification>>();
}
/*
@@ -252,9 +219,9 @@ Parameters:
Returns:
- util::Map<std::string, TrackedRecord<Service>>: Collection of service records
*/
util::Map<std::string, TrackedRecord<Service>>& DataStore::getServices()
util::Map<std::string, TrackedRecord<Service>> DataStore::getServices()
{
return m_serviceCache;
return util::Map<std::string, TrackedRecord<Service>>();
}
/*
@@ -265,9 +232,9 @@ Parameters:
Returns:
- util::Map<std::string, TrackedRecord<ComboPackage>>: Collection of combo package records
*/
util::Map<std::string, TrackedRecord<ComboPackage>>& DataStore::getComboPackages()
util::Map<std::string, TrackedRecord<ComboPackage>> DataStore::getComboPackages()
{
return m_comboPackageCache;
return util::Map<std::string, TrackedRecord<ComboPackage>>();
}
/*
@@ -278,9 +245,9 @@ Parameters:
Returns:
- util::Map<std::string, TrackedRecord<InventoryItem>>: Collection of inventory item records
*/
util::Map<std::string, TrackedRecord<InventoryItem>>& DataStore::getInventoryItems()
util::Map<std::string, TrackedRecord<InventoryItem>> DataStore::getInventoryItems()
{
return m_inventoryItemCache;
return util::Map<std::string, TrackedRecord<InventoryItem>>();
}
/*
@@ -291,9 +258,9 @@ Parameters:
Returns:
- util::Map<std::string, TrackedRecord<ServiceBooking>>: Collection of service booking records
*/
util::Map<std::string, TrackedRecord<ServiceBooking>>& DataStore::getServiceBookings()
util::Map<std::string, TrackedRecord<ServiceBooking>> DataStore::getServiceBookings()
{
return m_serviceBookingCache;
return util::Map<std::string, TrackedRecord<ServiceBooking>>();
}
/*
@@ -304,9 +271,9 @@ Parameters:
Returns:
- util::Map<std::string, TrackedRecord<JobCard>>: Collection of job card records
*/
util::Map<std::string, TrackedRecord<JobCard>>& DataStore::getJobCards()
util::Map<std::string, TrackedRecord<JobCard>> DataStore::getJobCards()
{
return m_jobCardCache;
return util::Map<std::string, TrackedRecord<JobCard>>();
}
/*
@@ -317,9 +284,22 @@ Parameters:
Returns:
- util::Map<std::string, TrackedRecord<Invoice>>: Collection of invoice records
*/
util::Map<std::string, TrackedRecord<Invoice>>& DataStore::getInvoices()
util::Map<std::string, TrackedRecord<Invoice>> DataStore::getInvoices()
{
return m_invoiceCache;
return util::Map<std::string, TrackedRecord<Invoice>>();
}
/*
Function: getPayments
Description: Retrieves all payment records from the datastore.
Parameters:
- None
Returns:
- util::Map<std::string, TrackedRecord<Payment>>: Collection of payment records
*/
util::Map<std::string, TrackedRecord<Payment>> DataStore::getPayments()
{
return util::Map<std::string, TrackedRecord<Payment>>();
}
/*
@@ -328,11 +308,11 @@ Description: Retrieves all service management observer records from the datastor
Parameters:
- None
Returns:
- util::Map<std::string, User*>: Collection of observer records
- util::Map<std::string, TrackedRecord<std::string>>: Collection of observer records
*/
util::Map<std::string, User*> DataStore::getServiceManagementObservers()
util::Map<std::string, TrackedRecord<std::string>> DataStore::getServiceManagementObservers()
{
return util::Map<std::string, User*>();
return util::Map<std::string, TrackedRecord<std::string>>();
}
/*
@@ -341,11 +321,11 @@ Description: Retrieves all payment management observer records from the datastor
Parameters:
- None
Returns:
- util::Map<std::string, User*>: Collection of observer records
- util::Map<std::string, TrackedRecord<std::string>>: Collection of observer records
*/
util::Map<std::string, User*> DataStore::getPaymentManagementObservers()
util::Map<std::string, TrackedRecord<std::string>> DataStore::getPaymentManagementObservers()
{
return util::Map<std::string, User*>();
return util::Map<std::string, TrackedRecord<std::string>>();
}
/*
@@ -354,22 +334,22 @@ Description: Retrieves all inventory management observer records from the datast
Parameters:
- None
Returns:
- util::Map<std::string, User*>: Collection of observer records
- util::Map<std::string, TrackedRecord<std::string>>: Collection of observer records
*/
util::Map<std::string, User*> DataStore::getInventoryManagementObservers()
util::Map<std::string, TrackedRecord<std::string>> DataStore::getInventoryManagementObservers()
{
return util::Map<std::string, User*>();
return util::Map<std::string, TrackedRecord<std::string>>();
}
/*
Function: saveUsers
Description: Persists all user records to the datastore.
Parameters:
- None
- users: util::Map<std::string, TrackedRecord<User>>&, collection of user records
Returns:
- None
*/
void DataStore::saveUsers()
void DataStore::saveUsers(util::Map<std::string, TrackedRecord<User>>& users)
{
}
@@ -377,11 +357,11 @@ void DataStore::saveUsers()
Function: saveNotifications
Description: Persists all notification records to the datastore.
Parameters:
- None
- notifications: util::Map<std::string, TrackedRecord<Notification>>&, collection of notification records
Returns:
- None
*/
void DataStore::saveNotifications()
void DataStore::saveNotifications(util::Map<std::string, TrackedRecord<Notification>>& notifications)
{
}
@@ -389,11 +369,11 @@ void DataStore::saveNotifications()
Function: saveServices
Description: Persists all service records to the datastore.
Parameters:
- None
- services: util::Map<std::string, TrackedRecord<Service>>&, collection of service records
Returns:
- None
*/
void DataStore::saveServices()
void DataStore::saveServices(util::Map<std::string, TrackedRecord<Service>>& services)
{
}
@@ -401,11 +381,11 @@ void DataStore::saveServices()
Function: saveComboPackages
Description: Persists all combo package records to the datastore.
Parameters:
- None
- comboPackages: util::Map<std::string, TrackedRecord<ComboPackage>>&, collection of combo package records
Returns:
- None
*/
void DataStore::saveComboPackages()
void DataStore::saveComboPackages(util::Map<std::string, TrackedRecord<ComboPackage>>& comboPackages)
{
}
@@ -413,11 +393,11 @@ void DataStore::saveComboPackages()
Function: saveInventoryItems
Description: Persists all inventory item records to the datastore.
Parameters:
- None
- inventoryItems: util::Map<std::string, TrackedRecord<InventoryItem>>&, collection of inventory item records
Returns:
- None
*/
void DataStore::saveInventoryItems()
void DataStore::saveInventoryItems(util::Map<std::string, TrackedRecord<InventoryItem>>& inventoryItems)
{
}
@@ -425,11 +405,11 @@ void DataStore::saveInventoryItems()
Function: saveServiceBookings
Description: Persists all service booking records to the datastore.
Parameters:
- None
- bookings: util::Map<std::string, TrackedRecord<ServiceBooking>>&, collection of service booking records
Returns:
- None
*/
void DataStore::saveServiceBookings()
void DataStore::saveServiceBookings(util::Map<std::string, TrackedRecord<ServiceBooking>>& bookings)
{
}
@@ -437,11 +417,11 @@ void DataStore::saveServiceBookings()
Function: saveJobCards
Description: Persists all job card records to the datastore.
Parameters:
- None
- jobCards: util::Map<std::string, TrackedRecord<JobCard>>&, collection of job card records
Returns:
- None
*/
void DataStore::saveJobCards()
void DataStore::saveJobCards(util::Map<std::string, TrackedRecord<JobCard>>& jobCards)
{
}
@@ -449,11 +429,23 @@ void DataStore::saveJobCards()
Function: saveInvoices
Description: Persists all invoice records to the datastore.
Parameters:
- None
- invoices: util::Map<std::string, TrackedRecord<Invoice>>&, collection of invoice records
Returns:
- None
*/
void DataStore::saveInvoices()
void DataStore::saveInvoices(util::Map<std::string, TrackedRecord<Invoice>>& invoices)
{
}
/*
Function: savePayments
Description: Persists all payment records to the datastore.
Parameters:
- payments: util::Map<std::string, TrackedRecord<Payment>>&, collection of payment records
Returns:
- None
*/
void DataStore::savePayments(util::Map<std::string, TrackedRecord<Payment>>& payments)
{
}
@@ -465,7 +457,7 @@ Parameters:
Returns:
- None
*/
void DataStore::saveServiceManagementObservers(util::Map<std::string, User*>& observers)
void DataStore::saveServiceManagementObservers(util::Map<std::string, TrackedRecord<std::string>>& observers)
{
}
@@ -473,11 +465,11 @@ void DataStore::saveServiceManagementObservers(util::Map<std::string, User*>& ob
Function: savePaymentManagementObservers
Description: Persists all payment management observer records to the datastore.
Parameters:
- observers: util::Map<std::string, User*>&, collection of observer records
- observers: util::Map<std::string, TrackedRecord<std::string>>&, collection of observer records
Returns:
- None
*/
void DataStore::savePaymentManagementObservers(util::Map<std::string, User*>& observers)
void DataStore::savePaymentManagementObservers(util::Map<std::string, TrackedRecord<std::string>>& observers)
{
}
@@ -485,11 +477,11 @@ void DataStore::savePaymentManagementObservers(util::Map<std::string, User*>& ob
Function: saveInventoryManagementObservers
Description: Persists all inventory management observer records to the datastore.
Parameters:
- observers: util::Map<std::string, User*>&, collection of observer records
- observers: util::Map<std::string, TrackedRecord<std::string>>&, collection of observer records
Returns:
- None
*/
void DataStore::saveInventoryManagementObservers(util::Map<std::string, User*>& observers)
void DataStore::saveInventoryManagementObservers(util::Map<std::string, TrackedRecord<std::string>>& observers)
{
}
@@ -562,4 +554,3 @@ bool DataStore::unlockDataStore()
}
return ReleaseMutex(m_globalMutex) != 0;
}
@@ -20,12 +20,12 @@ class InventoryItem;
class ServiceBooking;
class JobCard;
class Invoice;
class Payment;
class DataStore
{
private:
DataStore();
~DataStore();
DataStore(const DataStore&) = delete;
DataStore& operator=(const DataStore&) = delete;
DataStore(DataStore&&) = delete;
@@ -43,40 +43,34 @@ private:
MappingInfo m_serviceManagementObservers;
MappingInfo m_paymentManagementObservers;
MappingInfo m_inventoryManagementObservers;
util::Map<std::string, TrackedRecord<User>> m_userCache;
util::Map<std::string, TrackedRecord<Notification>> m_notificationCache;
util::Map<std::string, TrackedRecord<Service>> m_serviceCache;
util::Map<std::string, TrackedRecord<ComboPackage>> m_comboPackageCache;
util::Map<std::string, TrackedRecord<InventoryItem>> m_inventoryItemCache;
util::Map<std::string, TrackedRecord<ServiceBooking>> m_serviceBookingCache;
util::Map<std::string, TrackedRecord<JobCard>> m_jobCardCache;
util::Map<std::string, TrackedRecord<Invoice>> m_invoiceCache;
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, User*> getServiceManagementObservers();
util::Map<std::string, User*> getPaymentManagementObservers();
util::Map<std::string, User*> getInventoryManagementObservers();
void saveUsers();
void saveNotifications();
void saveServices();
void saveComboPackages();
void saveInventoryItems();
void saveServiceBookings();
void saveJobCards();
void saveInvoices();
void saveServiceManagementObservers(util::Map<std::string, User*>& observers);
void savePaymentManagementObservers(util::Map<std::string, User*>& observers);
void saveInventoryManagementObservers(util::Map<std::string, User*>& observers);
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();
util::Map<std::string, TrackedRecord<std::string>> getServiceManagementObservers();
util::Map<std::string, TrackedRecord<std::string>> getPaymentManagementObservers();
util::Map<std::string, TrackedRecord<std::string>> getInventoryManagementObservers();
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);
void saveServiceManagementObservers(util::Map<std::string, TrackedRecord<std::string>>& observers);
void savePaymentManagementObservers(util::Map<std::string, TrackedRecord<std::string>>& observers);
void saveInventoryManagementObservers(util::Map<std::string, TrackedRecord<std::string>>& observers);
bool lockDataStore();
bool unlockDataStore();
private:
@@ -84,8 +78,6 @@ private:
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);
template<typename TObject> void clearCache(util::Map<std::string, TrackedRecord<TObject>>&cache);
template<typename TObject> void refreshCache(util::Map<std::string, TrackedRecord<TObject>>&cache, util::Map<std::string, TrackedRecord<TObject>>&refreshedCache);
};
/*
@@ -131,7 +123,9 @@ Description: Persists all modified and newly added records
shared-memory mapping. Modified records overwrite
their existing slots, while new records are
appended to the end of the mapping. Records marked
as CLEAN are ignored.
as CLEAN are ignored. After persistence, all
temporary objects owned by the tracked records are
destroyed to release memory.
Parameter:
- mapping: Reference to the mapping where records are
stored.
@@ -167,47 +161,11 @@ template<typename TObject, typename TSerialized> void DataStore::saveRecords(Map
TSerialized* destination = static_cast<TSerialized*>(SharedMemory::getRecordAddress(mapping, recordCount));
*destination = serialized;
SharedMemory::setRecordCount(mapping, recordCount + 1);
record.slotIndex = recordCount;
}
record.state = RecordState::CLEAN;
}
}
/*
Function: clearCache
Description: Releases all objects owned by the cache and
clears the cache contents.
Parameters:
- cache: Cache to be cleared.
Returns:
- None
*/
template<typename TObject>
void DataStore::clearCache(util::Map<std::string, TrackedRecord<TObject>>&cache)
for (int index = 0; index < records.getSize(); ++index)
{
for (int index = 0; index < cache.getSize(); ++index)
{
delete cache.getValueAt(index).data;
cache.getValueAt(index).data = nullptr;
delete records.getValueAt(index).data;
records.getValueAt(index).data = nullptr;
}
cache.clear();
}
/*
Function: refreshCache
Description: Replaces the contents of an existing cache
with a newly loaded cache. Existing cached
objects are destroyed before ownership of
the new cache contents is transferred.
Parameters:
- cache: Existing cache to refresh.
- refreshedCache: Newly loaded cache contents.
Returns:
- None
*/
template<typename TObject>
void DataStore::refreshCache(util::Map<std::string, TrackedRecord<TObject>>&cache, util::Map<std::string, TrackedRecord<TObject>>&refreshedCache)
{
clearCache(cache);
cache = refreshedCache;
}