1 #ifndef _READINGS_CATALOGUE_H 2 #define _READINGS_CATALOGUE_H 13 #include "connection.h" 16 #define OVERFLOW_TABLE_ID 0 // Table ID to use for the overflow table 30 std::map<std::thread::id, unsigned long>
32 std::mutex m_boundaryLock;
47 int nReadingsPerDb = 14;
48 int nDbPreallocate = 3;
49 int nDbLeftFreeBeforeAllocate = 1;
50 int nDbToAllocate = 2;
59 TableReference(
int dbId,
int tableId) : m_dbId(dbId), m_tableId(tableId)
148 std::string generateDbAlias(
int dbId);
149 std::string generateDbName(
int tableId);
150 std::string generateDbFileName(
int dbId);
151 std::string generateDbNameFromTableId(
int tableId);
152 std::string generateReadingsName(
int dbId,
int tableId);
153 void getAllDbs(std::vector<int> &dbIdList);
154 void getNewDbs(std::vector<int> &dbIdList);
155 int getMaxReadingsId(
int dbId);
156 int getReadingsCount();
157 int getReadingPosition(
int dbId,
int tableId);
158 int getNReadingsAvailable()
const {
return m_nReadingsAvailable;}
159 long getIncGlobalId() {
return m_ReadingsGlobalId.fetch_add(1); }
160 long getMinGlobalId (sqlite3 *dbHandle);
161 long getGlobalId() {
return m_ReadingsGlobalId;};
162 bool evaluateGlobalId();
163 bool storeGlobalId ();
165 void preallocateReadingsTables(
int dbId);
166 bool loadAssetReadingCatalogue();
167 bool loadEmptyAssetReadingCatalogue(
bool clean =
true);
169 bool latestDbUpdate(sqlite3 *dbHandle,
int newDbId);
170 int preallocateNewDbsRange(
int dbIdStart,
int dbIdEnd);
173 bool attachDbsToAllConnections();
174 std::string sqlConstructMultiDb(std::string &sqlCmdBase, std::vector<std::string> &assetCodes,
bool considerExclusion=
false);
175 std::string sqlConstructOverflow(std::string &sqlCmdBase, std::vector<std::string> &assetCodes,
bool considerExclusion=
false,
bool groupBy =
false);
176 int purgeAllReadings(sqlite3 *dbHandle,
const char *sqlCmdBase,
char **errMsg = NULL,
unsigned long *rowsAffected = NULL);
178 bool connectionAttachAllDbs(sqlite3 *dbHandle);
179 bool connectionAttachDbList(sqlite3 *dbHandle, std::vector<int> &dbIdList);
180 bool attachDb(sqlite3 *dbHandle, std::string &path, std::string &alias,
int dbId);
181 void detachDb(sqlite3 *dbHandle, std::string &alias);
183 void setUsedDbId(
int dbId);
184 int extractReadingsIdFromName(std::string tableName);
185 int extractDbIdFromName(std::string tableName);
186 int SQLExec(sqlite3 *dbHandle,
const char *sqlCmd,
char **errMsg = NULL);
187 bool createReadingsOverflowTable(sqlite3 *dbHandle,
int dbId);
188 int getMaxAttached() {
return m_attachLimit; };
195 enum NEW_DB_OPERATION {
197 NEW_DB_ATTACH_REQUEST,
211 typedef struct ReadingAvailable {
215 } tyReadingsAvailable;
219 bool createNewDB(sqlite3 *dbHandle,
int newDbId,
int startId, NEW_DB_OPERATION attachAllDb);
220 int getUsedTablesDbId(
int dbId);
221 int getNReadingsAllocate()
const {
return m_storageConfigCurrent.nReadingsPerDb;}
222 bool createReadingsTables(sqlite3 *dbHandle,
int dbId,
int idStartFrom,
int nTables);
223 bool isReadingAvailable()
const;
224 void allocateReadingAvailable();
225 tyReadingsAvailable evaluateLastReadingAvailable(sqlite3 *dbHandle,
int dbId);
226 long calculateGlobalId (sqlite3 *dbHandle);
227 std::string generateDbFilePath(
int dbId);
229 void raiseError(
const char *operation,
const char *reason,...);
230 int SQLStep(sqlite3_stmt *statement);
231 bool enableWAL(std::string &dbPathReadings);
233 bool configurationRetrieve(sqlite3 *dbHandle);
234 void prepareAllDbs();
235 bool applyStorageConfigChanges(sqlite3 *dbHandle);
236 void dbFileDelete(std::string dbPath);
237 void dbsRemove(
int startId,
int endId);
238 void storeReadingsConfiguration (sqlite3 *dbHandle);
239 ACTION changesLogicDBs(
int dbIdCurrent ,
int dbIdLast,
int nDbPreallocateCurrent,
int nDbPreallocateRequest,
int nDbLeftFreeBeforeAllocate);
240 ACTION changesLogicTables(
int maxUsed ,
int Current,
int Request);
241 int retrieveDbIdFromTableId(
int tableId);
243 void configChangeAddDb(sqlite3 *dbHandle);
244 void configChangeRemoveDb(sqlite3 *dbHandle);
245 void configChangeAddTables(sqlite3 *dbHandle ,
int startId,
int endId);
246 void configChangeRemoveTables(sqlite3 *dbHandle ,
int startId,
int endId);
248 int calcMaxReadingUsed();
249 void dropReadingsTables(sqlite3 *dbHandle,
int dbId,
int idStart,
int idEnd);
261 m_nReadingsAvailable = 0;
262 std::map <std::string, TableReference> m_AssetReadingCatalogue={
267 std::map <std::string, std::pair<int, int>> m_EmptyAssetReadingCatalogue={
273 int m_maxOverflowUsed;
275 std::mutex m_emptyReadingTableMutex;
293 void lock() {m_dbLock.lock();}
294 void unlock() {m_dbLock.unlock();}
Implements the handling of multiples readings tables stored among multiple SQLite databases...
Definition: readings_catalogue.h:127
void ClearThreadTransaction(std::thread::id)
Remove committed TRANSACTION for the given thread.
Definition: readings_catalogue.cpp:2897
Definition: readings_catalogue.h:130
This class handles per thread started transaction boundaries:
Definition: readings_catalogue.h:21
Used to synchronize the attach database operation.
Definition: readings_catalogue.h:284
void SetThreadTransactionStart(std::thread::id tid, unsigned long id)
Set BEGIN of a transaction for a given thread, reading id.
Definition: readings_catalogue.cpp:2926
Class used to store table references.
Definition: readings_catalogue.h:57
unsigned long GetMinReadingId()
Fetch the minimum safe global reading id among all UNCOMMITTED per thread transactions.
Definition: readings_catalogue.cpp:2948
Definition: connection.h:32
Definition: readings_catalogue.h:44