diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp index e69de29..7c8dc5e 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp @@ -0,0 +1,86 @@ +#include "SharedMemory.h" +#include "Config.h" + +bool SharedMemory::createOrOpenMapping(MappingInfo& mapping) +{ + if (mapping.recordSize == 0) + { + return false; + } + mapping.fileHandle = + CreateFileA( + mapping.fileName.c_str(), + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_ALWAYS, + FILE_ATTRIBUTE_NORMAL, + NULL); + if (mapping.fileHandle == INVALID_HANDLE_VALUE) + { + return false; + } + LARGE_INTEGER fileSize; + if (!GetFileSizeEx(mapping.fileHandle, &fileSize)) + { + CloseHandle(mapping.fileHandle); + mapping.fileHandle = INVALID_HANDLE_VALUE; + return false; + } + bool isNewFile = (fileSize.QuadPart == 0); + const size_t initialCapacity = config::file::INITIAL_CAPACITY; + if (isNewFile) + { + LARGE_INTEGER newSize; + newSize.QuadPart = sizeof(FileHeader) + initialCapacity * mapping.recordSize; + if (!SetFilePointerEx(mapping.fileHandle, newSize, NULL, FILE_BEGIN)) + { + CloseHandle(mapping.fileHandle); + mapping.fileHandle = INVALID_HANDLE_VALUE; + return false; + } + if (!SetEndOfFile(mapping.fileHandle)) + { + CloseHandle(mapping.fileHandle); + mapping.fileHandle = INVALID_HANDLE_VALUE; + return false; + } + } + mapping.mappingHandle = + CreateFileMappingA( + mapping.fileHandle, + NULL, + PAGE_READWRITE, + 0, + 0, + NULL); + if (mapping.mappingHandle == NULL) + { + CloseHandle(mapping.fileHandle); + mapping.fileHandle = INVALID_HANDLE_VALUE; + return false; + } + mapping.mappedView = + MapViewOfFile( + mapping.mappingHandle, + FILE_MAP_ALL_ACCESS, + 0, + 0, + 0); + if (mapping.mappedView == nullptr) + { + CloseHandle(mapping.mappingHandle); + CloseHandle(mapping.fileHandle); + mapping.mappingHandle = NULL; + mapping.fileHandle = INVALID_HANDLE_VALUE; + return false; + } + FileHeader* header = reinterpret_cast(mapping.mappedView); + if (isNewFile) + { + header->recordCount = 0; + header->capacity = initialCapacity; + } + mapping.mappedCapacity = header->capacity; + return true; +} diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h index b0bd19d..dd5eaa8 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h @@ -28,6 +28,7 @@ namespace config namespace file { + const size_t INITIAL_CAPACITY = 100; constexpr const char* INVENTORYITEM_FILE = "files/InventoryItem.csv"; constexpr const char* USER_FILE = "files/User.csv"; constexpr const char* NOTIFICATION_FILE = "files/Notification.csv";