MVault 1.0.0
Simple c++ database
Loading...
Searching...
No Matches
Vault.h
1#pragma once
2
3#include <list>
4#include <vector>
5#include <functional>
6
7#include "VaultClasses.h"
8
9#include "Map.h"
10#include "VaultRecord.h"
11#include "VaultRequest.h"
12#include "VaultRecordRef.h"
13#include "VaultParamInput.h"
14#include "VaultOperationResult.h"
15
16#include "CsvParser/CsvParser.h"
17
18#include "Strings/ToJson.h"
19#include "Strings/PrintAsTable.h"
20
21namespace mvlt
22{
34 class Vault
35 {
36 private:
37 // Template of data stored inside Vault
38 VaultRecord RecordTemplate;
39
40 /*
41 Hash map to store records
42 A string with the name of the key is used as the key. All keys are the same as in Vault.
43 The value stores a pointer to std::unordered_multimap<T, VaultRecord*>.
44 The key type is same as the Vault key value type.
45 The value is a pointer to VaultRecord.
46
47 Such a complex structure is needed to quickly, in O(1), search for each key with any type.
48 */
49 mutable DataHashMap VaultHashMapStructure;
50
51 /*
52 Map to store records
53 A string with the name of the key is used as the key. All keys are the same as in Vault.
54 The value stores a pointer to std::multimap<T, VaultRecord*>.
55 The key type is same as the Vault key value type.
56 The value is a pointer to VaultRecord.
57
58 Such a complex structure is necessary in order to quickly, in O(log n),
59 find a set of elements that meet a certain requirement, for example, more than a certain value or less than this value
60 */
61 mutable DataMap VaultMapStructure;
62
63 // Unordered map with keys names and their types
64 std::unordered_map<std::string, std::type_index> KeysTypes;
65
66 // Unordered_map of functions that add a new element to the VaultStructureHashMap
67 std::unordered_map<std::string, std::function<bool(VaultRecord* newRecord)>> VaultRecordAdders;
68
69 // Unordered_map of functions which clean up the Vault structure, but do not delete records
70 std::unordered_map<std::string, std::function<void()>> VaultRecordClearers;
71
72 // Unordered_map of functions that erase record from the unordered_map's
73 std::unordered_map<std::string, std::function<void(VaultRecord* record)>> VaultRecordErasers;
74
75 // Unordered_map of functions for getting sorted data.
76 // The key is a string with the name of the key from the Vault.
77 // The std::function is used as the value, in which the lambda function is written at the time of adding the key.
78 // Lambda accepts a function that is called for each record inside. VaultRecordRef and Vault pointer is passed to it.
79 // By default, iteration by records occurs in ascending order.
80 // isReverse parameter is used for the reverse order.
81 std::unordered_map<std::string, std::function<void(const std::function<bool(const VaultRecordRef& ref)>& functionToSortedData, Vault* vltPtr, const bool& isReverse)>> VaultRecordSorters;
82
83 // Unordered_map of functions that copy keys from this to VaultRecordSet
84 std::unordered_map<std::string, std::function<void(Vault* vaultRecordSet)>> VaultKeyCopiers;
85
86 // List to store keys order
87 std::list<std::string> KeysOrder;
88
89 // Set with all unique keys
90 std::set<std::string> UniqueKeys;
91
92 // Vector with all invalid records in last readed file
93 std::vector<std::pair<std::size_t, std::string>> InvalidFileRecords;
94
95 // Recursive mutex for thread safety
96 mutable RecursiveReadWriteMutex RecursiveReadWriteMtx;
97
98 protected:
100 enum class VaultDerivedClasses : std::uint8_t
101 {
102 VaultBase,
104 };
105
108
110 std::unordered_set<VaultRecord*> RecordsSet;
111
113 mutable std::unordered_set<VaultRecordSet*> RecordSetsSet;
114
126 template <class T>
127 VaultOperationResult SetDataToRecord(VaultRecord* dataRecord, const std::string& key, const T& data) noexcept;
128
139 std::unordered_set<VaultRecord*>::iterator RemoveRecord(VaultRecord* recordToErase, bool* wasDeleted) noexcept;
140
159 template <class T>
160 VaultOperationResult RequestRecordsSet(const VaultRequestType& requestType, const std::string& key, const T& beginKeyValue,
161 const T& endKeyValue, std::unordered_set<VaultRecord*>& recordsSet, const bool& isIncludeBeginKeyValue,
162 const bool& isIncludeEndKeyValue, const std::size_t& amountOfRecords, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat) const noexcept;
163
182 template <class T>
183 VaultOperationResult RequestRecords(const VaultRequestType& requestType, const std::string& key, const T& beginKeyValue,
185 const bool& isIncludeEndKeyValue, const std::size_t& amountOfRecords, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat) const noexcept;
186
200 template <class T>
201 VaultOperationResult AddKey(const std::string& key, const T& defaultKeyValue, const bool& isUniqueKey, const bool& isUniqueKeyWithoutLambda,
202 const std::function<T(const std::size_t& counter, const VaultRecordRef& ref)>& uniqueKeyFunction) noexcept;
203
218 bool ReadFile(const std::string& fileName, const bool& isPreprocessRecord,
219 const char& separator, const bool& isLoadKeys, const std::vector<std::string>& userKeys,
220 const std::function<void(const std::vector<std::string>& keys, std::vector<std::string>& values)>& recordHandler) noexcept;
221
222 public:
225
228
230 template <VaultRequestType Type>
231 friend class VaultRequest;
232
234 friend bool operator==(const VaultRecordSet& a, const VaultRecordSet& b) noexcept;
235
237 Vault() noexcept;
238
245
254
261
270
283
297
318
333
341 bool IsKeyExist(const std::string& key) const noexcept;
342
355
365
371 std::vector<std::string> GetKeys() const noexcept;
372
379
387 bool RemoveKey(const std::string& key) noexcept;
388
445
459
476
492
509 const std::size_t& amountOfRecords = -1, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat = DefaultRequestPredicat) const noexcept;
510
527 const std::size_t& amountOfRecords = -1, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat = DefaultRequestPredicat) const noexcept;
528
545 const std::size_t& amountOfRecords = -1, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat = DefaultRequestPredicat) const noexcept;
546
563 const std::size_t& amountOfRecords = -1, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat = DefaultRequestPredicat) const noexcept;
564
581 const std::size_t& amountOfRecords = -1, const std::function<bool(const VaultRecordRef& ref)>& requestPredicat = DefaultRequestPredicat) const noexcept;
582
604 const std::function<bool(const VaultRecordRef& ref)>& requestPredicat = DefaultRequestPredicat) const noexcept;
605
612 template <VaultRequestType Type>
614
620 void DropVault() noexcept;
621
623 void DropData() noexcept;
624
631
644
660
665 std::size_t Size() const noexcept;
666
678
696
708 std::string ToJson(const bool& isFormat = false, const std::size_t& tabSize = 2, const bool& isUseRecordTemplate = true,
710
716 std::vector<std::vector<std::pair<std::string, std::string>>> ToStrings() const noexcept;
717
727 void Print(const bool& isPrintId = false, const std::size_t& amountOfRecords = -1, const std::string& primaryKey = "", const bool& isReverse = false,
728 const std::list<std::string>& keys = {}) const noexcept;
729
740 bool SaveToFile(const std::string& fileName, const std::vector<std::string>& keys = {}, const std::string& separator = ",", const bool& isSaveKey = true) const noexcept;
741
752 bool ReadFile(const std::string& fileName, const char& separator = ',', const bool& isLoadKeys = true, const std::vector<std::string>& keys = {}) noexcept;
753
765 bool ReadFile(const std::string& fileName, const char& separator, const std::function<void(const std::vector<std::string>& keys, std::vector<std::string>& values)>& recordHandler) noexcept;
766
774 std::vector<std::pair<std::size_t, std::string>> GetErrorsInLastReadedFile() const noexcept;
775
777 ~Vault() noexcept;
778
780 friend VaultOperationResult Intersection(const VaultRecordSet& a, const VaultRecordSet& b, VaultRecordSet& res) noexcept;
781 };
782}
Iterator class for all library maps.
Definition Map.h:18
Specialization of class DataContainer, used as a type std::unordered_map<std::string,...
Definition DataContainer.h:288
Specialization of class DataContainer, used as a type std::map<std::string, DataSaver>
Definition DataContainer.h:312
A class for synchronizing threads.
Definition ReadWriteMutex.h:71
A class for storing data with the ability to quickly search for a variety of different keys of any ty...
Definition Vault.h:35
bool EraseRecord(const VaultRecordRef &recordRefToErase) noexcept
Method for deleting a record from a Vault.
Definition Vault.cpp:626
friend VaultOperationResult Intersection(const VaultRecordSet &a, const VaultRecordSet &b, VaultRecordSet &res) noexcept
Making Intersection function friendly.
Definition VaultRecordSet.cpp:616
VaultOperationResult RequestLessOrEqual(const std::string &key, const T &keyValue, VaultRecordSet &vaultRecordSet, const std::size_t &amountOfRecords=-1, const std::function< bool(const VaultRecordRef &ref)> &requestPredicat=DefaultRequestPredicat) const noexcept
A method for getting all records that have a value less than or equal to keyValue stored by the key k...
Definition Vault.hpp:846
std::size_t Size() const noexcept
Method for getting the number of records.
Definition Vault.cpp:639
std::unordered_set< VaultRecord * >::iterator RemoveRecord(VaultRecord *recordToErase, bool *wasDeleted) noexcept
Method for removing a record from a Vault.
Definition Vault.cpp:9
std::string ToJson(const bool &isFormat=false, const std::size_t &tabSize=2, const bool &isUseRecordTemplate=true, const std::string &recordTemplate="Record", const bool &isArray=false) const noexcept
Method for saving the contents of the Vault in json.
Definition Vault.cpp:701
VaultOperationResult GetKeyValue(const std::string &key, T &defaultKeyValue) const noexcept
The method for getting a default key value.
Definition Vault.hpp:625
VaultOperationResult RequestRecords(const VaultRequestType &requestType, const std::string &key, const T &beginKeyValue, const T &endKeyValue, VaultRecordSet &vaultRecordSet, const bool &isIncludeBeginKeyValue, const bool &isIncludeEndKeyValue, const std::size_t &amountOfRecords, const std::function< bool(const VaultRecordRef &ref)> &requestPredicat) const noexcept
The method for getting the result of the request.
Definition Vault.hpp:272
void DropData() noexcept
A method for deleting all data, but keeping all keys.
Definition Vault.cpp:603
void Print(const bool &isPrintId=false, const std::size_t &amountOfRecords=-1, const std::string &primaryKey="", const bool &isReverse=false, const std::list< std::string > &keys={}) const noexcept
A method for displaying the contents of a Vault as a table on the screen.
Definition Vault.cpp:797
bool GetKeyType(const std::string &key, std::type_index &keyType) const noexcept
The method for getting a key type.
Definition Vault.cpp:326
std::vector< std::pair< std::size_t, std::string > > GetErrorsInLastReadedFile() const noexcept
A method for getting errors in the last read file.
Definition Vault.cpp:1048
VaultOperationResult SetDataToRecord(VaultRecord *dataRecord, const std::string &key, const T &data) noexcept
Method for setting a new value in VaultRecord and Vault.
Definition Vault.hpp:13
bool ReadFile(const std::string &fileName, const bool &isPreprocessRecord, const char &separator, const bool &isLoadKeys, const std::vector< std::string > &userKeys, const std::function< void(const std::vector< std::string > &keys, std::vector< std::string > &values)> &recordHandler) noexcept
A method for reading a csv file and loading data from it into memory.
Definition Vault.cpp:40
VaultOperationResult AddKey(const std::string &key, const T &defaultKeyValue, const bool &isUniqueKey, const bool &isUniqueKeyWithoutLambda, const std::function< T(const std::size_t &counter, const VaultRecordRef &ref)> &uniqueKeyFunction) noexcept
Template method to add new key with default value to Vault.
Definition Vault.hpp:325
std::vector< std::string > GetUniqueKeys() const noexcept
The method for getting the unique keys.
Definition Vault.cpp:356
VaultOperationResult GetRecord(const std::string &key, const T &keyValue, VaultRecordRef &vaultRecordRef) const noexcept
The method for getting a reference to the data inside Vault.
Definition Vault.hpp:672
bool RemoveKey(const std::string &key) noexcept
The method for deleting the key.
Definition Vault.cpp:370
VaultOperationResult RequestRecordsSet(const VaultRequestType &requestType, const std::string &key, const T &beginKeyValue, const T &endKeyValue, std::unordered_set< VaultRecord * > &recordsSet, const bool &isIncludeBeginKeyValue, const bool &isIncludeEndKeyValue, const std::size_t &amountOfRecords, const std::function< bool(const VaultRecordRef &ref)> &requestPredicat) const noexcept
The method for getting the result of the request in the std::set.
Definition Vault.hpp:129
std::unordered_set< VaultRecord * > RecordsSet
Unordered set with all VaultRecord pointers.
Definition Vault.h:110
VaultOperationResult GetRecords(const std::string &key, const T &keyValue, std::vector< VaultRecordRef > &recordsRefs, const std::size_t &amountOfRecords=-1) const noexcept
The method for getting a vector of references to the data inside Vault.
Definition Vault.hpp:729
std::vector< VaultRecordRef > GetSortedRecords(const std::string &key, const bool &isReverse=false, const std::size_t &amountOfRecords=-1) const noexcept
Method for getting sorted records.
Definition Vault.cpp:651
VaultDerivedClasses VaultDerivedClass
A variable for storing the object type in the Vault inheritance tree.
Definition Vault.h:107
std::vector< std::string > GetKeys() const noexcept
The method for getting all the keys.
Definition Vault.cpp:342
friend VaultRecordRef
Making the VaultRecordRef class friendly so that it has access to the internal members of the Vault c...
Definition Vault.h:224
VaultOperationResult CreateRecord(const std::vector< std::pair< std::string, VaultParamInput > > &params) noexcept
Method to create new VaultRecord.
Definition Vault.cpp:428
VaultOperationResult RequestEqual(const std::string &key, const T &keyValue, VaultRecordSet &vaultRecordSet, const std::size_t &amountOfRecords=-1, const std::function< bool(const VaultRecordRef &ref)> &requestPredicat=DefaultRequestPredicat) const noexcept
A method for getting all records that have a value equal to keyValue stored by the key key.
Definition Vault.hpp:794
VaultOperationResult RequestGreater(const std::string &key, const T &keyValue, VaultRecordSet &vaultRecordSet, const std::size_t &amountOfRecords=-1, const std::function< bool(const VaultRecordRef &ref)> &requestPredicat=DefaultRequestPredicat) const noexcept
A method for getting all records that have a value greater than keyValue stored by the key key.
Definition Vault.hpp:807
friend bool operator==(const VaultRecordSet &a, const VaultRecordSet &b) noexcept
Making VaultRecordSet operator comparison function friendly.
Definition VaultRecordSet.cpp:557
void SortBy(const std::string &key, const std::function< bool(const VaultRecordRef &ref)> &func, const bool &isReverse=false, const std::size_t &amountOfRecords=-1) const noexcept
Method for handle sorted records.
Definition Vault.cpp:677
VaultOperationResult RequestLess(const std::string &key, const T &keyValue, VaultRecordSet &vaultRecordSet, const std::size_t &amountOfRecords=-1, const std::function< bool(const VaultRecordRef &ref)> &requestPredicat=DefaultRequestPredicat) const noexcept
A method for getting all records that have a value less than keyValue stored by the key key.
Definition Vault.hpp:833
std::vector< std::vector< std::pair< std::string, std::string > > > ToStrings() const noexcept
Method for convert vault to strings.
Definition Vault.cpp:770
void DropVault() noexcept
A method for deleting all data and keys.
Definition Vault.cpp:541
VaultOperationResult RequestInterval(const std::string &key, const T &beginKeyValue, const T &endKeyValue, VaultRecordSet &vaultRecordSet, const bool &isIncludeBeginKeyValue=true, const bool &isIncludeEndKeyValue=true, const std::size_t &amountOfRecords=-1, const std::function< bool(const VaultRecordRef &ref)> &requestPredicat=DefaultRequestPredicat) const noexcept
The method for getting the result of the request.
Definition Vault.hpp:859
Vault() noexcept
Default constructor.
Definition Vault.cpp:182
bool SaveToFile(const std::string &fileName, const std::vector< std::string > &keys={}, const std::string &separator=",", const bool &isSaveKey=true) const noexcept
A method for saving data to a table file. The file format is csv.
Definition Vault.cpp:946
VaultDerivedClasses
Enum for storing the object type during inheritance.
Definition Vault.h:101
@ VaultRecordSetDerived
VaultRecordSet class.
@ VaultBase
Vault class itself.
std::unordered_set< VaultRecordSet * > RecordSetsSet
Unordered set with all VaultRecordSet pointers.
Definition Vault.h:113
VaultOperationResult Request(const VaultRequest< Type > &request, VaultRecordSet &vaultRecordSet) const
A method for complex requests.
Definition Vault.hpp:875
friend VaultRecordSet
Making the VaultRecordSet class friendly so that it has access to the internal members of the Vault c...
Definition Vault.h:227
VaultOperationResult RequestGreaterOrEqual(const std::string &key, const T &keyValue, VaultRecordSet &vaultRecordSet, const std::size_t &amountOfRecords=-1, const std::function< bool(const VaultRecordRef &ref)> &requestPredicat=DefaultRequestPredicat) const noexcept
A method for getting all records that have a value greater than or equal to keyValue stored by the ke...
Definition Vault.hpp:820
VaultOperationResult EraseRecords(const std::string &key, const T &keyValue, const std::size_t &amountOfRecords=-1) noexcept
The method for erase records using key and value.
Definition Vault.hpp:1008
VaultOperationResult UpdateKey(const std::string &key, const T &defaultKeyValue) noexcept
Template method to update default key value.
Definition Vault.hpp:574
VaultOperationResult AddUniqueKey(const std::string &key) noexcept
Template method to add new unique key to Vault.
Definition Vault.hpp:554
bool IsKeyExist(const std::string &key) const noexcept
The method for getting a default key value.
Definition Vault.cpp:316
A class for transferring data to the Vault.
Definition VaultParamInput.h:18
A class for storing data inside Vault.
Definition VaultRecord.h:18
A class that provides access to data inside Vault.
Definition VaultRecordRef.h:21
A class for storing query results.
Definition VaultRecordSet.h:14
A class for requests to Vault.
Definition VaultRequest.h:16
Structure for storing the results of MVault operations.
Definition VaultOperationResult.h:44