3b1f3301d6
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 - Added datastore-owned record caches for runtime object management - Updated datastore APIs to return cached tracked-record collections by reference - Added generic cache refresh and cleanup infrastructure - Updated save operations to persist datastore caches directly - Added automatic cache cleanup during datastore destruction - Prepared datastore for multi-process shared-memory persistence
109 lines
3.3 KiB
C++
109 lines
3.3 KiB
C++
/*
|
|
File: FileHelper.h
|
|
Description: Provides utility functions for loading and saving records
|
|
from and to CSV-like text files. Ensures files are created
|
|
if missing and supports simple record persistence.
|
|
Author: Trenser
|
|
Date: 22-May-2026
|
|
*/
|
|
|
|
#pragma once
|
|
#include <fstream>
|
|
#include <string>
|
|
#include <stdexcept>
|
|
#include <direct.h>
|
|
#include "Vector.h"
|
|
|
|
namespace util
|
|
{
|
|
/*
|
|
Function: ensureDirectoryExists
|
|
Description: Creates all missing directories present in the given file path.
|
|
Iteratively parses the path and creates each directory level
|
|
using _mkdir() before file operations are performed.
|
|
Parameters:
|
|
- filePath: const std::string&, relative or absolute file path
|
|
Returns:
|
|
- void
|
|
Throws:
|
|
- None (_mkdir failures are intentionally ignored if directory already exists)
|
|
*/
|
|
inline void ensureDirectoryExists(const std::string& filePath)
|
|
{
|
|
size_t position = 0;
|
|
|
|
while ((position = filePath.find('/', position)) != std::string::npos)
|
|
{
|
|
std::string directory = filePath.substr(0, position);
|
|
|
|
if (!directory.empty())
|
|
{
|
|
(void)_mkdir(directory.c_str());
|
|
}
|
|
position++;
|
|
}
|
|
}
|
|
|
|
/*
|
|
Function: loadRecords
|
|
Description: Loads records from a given file path into a vector of strings.
|
|
Skips the header line if present. Creates the file if it does not exist.
|
|
Parameters:
|
|
- filePath: const std::string&, path to the file
|
|
Returns:
|
|
- util::Vector<std::string>: Vector containing all records (excluding header)
|
|
Throws:
|
|
- None (creates file if missing)
|
|
*/
|
|
inline util::Vector<std::string> loadRecords(const std::string& filePath)
|
|
{
|
|
util::Vector<std::string> records;
|
|
std::ifstream file(filePath);
|
|
if (!file.is_open())
|
|
{
|
|
ensureDirectoryExists(filePath);
|
|
std::ofstream newFile(filePath);
|
|
newFile.close();
|
|
file.open(filePath);
|
|
}
|
|
std::string line;
|
|
bool isHeader = true;
|
|
while (std::getline(file, line))
|
|
{
|
|
if (isHeader)
|
|
{
|
|
isHeader = false;
|
|
continue;
|
|
}
|
|
records.push_back(line);
|
|
}
|
|
return records;
|
|
}
|
|
|
|
/*
|
|
Function: saveRecords
|
|
Description: Saves records to a given file path. Overwrites existing content
|
|
and writes a header line followed by all records.
|
|
Parameters:
|
|
- filePath: const std::string&, path to the file
|
|
- records: const util::Vector<std::string>&, vector of records to save
|
|
Returns:
|
|
- void
|
|
Throws:
|
|
- std::runtime_error if the file cannot be opened for writing
|
|
*/
|
|
inline void saveRecords(const std::string& filePath, const util::Vector<std::string>& records)
|
|
{
|
|
std::ofstream file(filePath, std::ios::trunc);
|
|
if (!file.is_open())
|
|
{
|
|
throw std::runtime_error("Failed to open file " + filePath);
|
|
}
|
|
file << "Values" << '\n';
|
|
int numberOfRecords = records.getSize();
|
|
for (int index = 0; index < numberOfRecords; index++)
|
|
{
|
|
file << records[index] << '\n';
|
|
}
|
|
}
|
|
} |