Files
secondo/Algebras/Temporal2/MemStorageManager.h
2026-01-23 17:03:45 +08:00

86 lines
2.7 KiB
C++

/*
The MemStorageManager handles the lifetime of the MPoint2 related components:
- in-memory data structure (MemUpdateStorage)
- logger for in-memory updates (DbUpdateLogger)
*/
#ifndef ALGEBRAS_TEMPORAL2_MEMSTORAGEMANAGER_H_
#define ALGEBRAS_TEMPORAL2_MEMSTORAGEMANAGER_H_
#include <tr1/memory> // std::tr1::shared_ptr
#include <string>
#include <boost/interprocess/sync/named_mutex.hpp>
#include "Types.h"
#include "DatabaseListener.h"
namespace temporal2algebra {
class MemUpdateStorage;
typedef std::tr1::shared_ptr<MemUpdateStorage> MemUpdateStoragePtr;
class DbUpdateLogger;
typedef std::tr1::shared_ptr<DbUpdateLogger> DbUpdateLoggerPtr;
class MemStorageManager : public DatabaseListener {
public:
// we need to Access the StorageManager from MPoint2 (and other classes)
// But we cannot pass it directly... so rely on singleton.
static MemStorageManager* getInstance(); // not thread safe!
// Dedicated construction and deletion of instance
// (To allow controlled creation/deletion of instance during algebra
// construction/destruction)
static void createInstance();
static void deleteInstance();
virtual ~MemStorageManager();
const MemStorageId createId();
void setBackRef(const MemStorageId& id,
const BackReference& backRef, const Unit& finalUnit);
bool hasMemoryUnits(const MemStorageId id);
Unit Get(const MemStorageId id, size_t memIndex) ; /*const*/
Unit getFinalUnit (const MemStorageId id); /*const*/
MemStorageId getId(const BackReference& backRef);
int Size(const MemStorageId id);
void append(const MemStorageId id, const Unit& unit);
void clear (const MemStorageId id);
int pushToFlobs(MemStorageId id_to_keep);
void applyLog (const LogData& log);
// required methods for DatabaseListener
virtual void openDatabase(const std::string& name);
virtual void closeDatabase();
protected:
MemStorageManager();
private:
// helper to make sure we still have the correct Storage
// if not: cleanup old Storage and connect/create to new Storage
void ensureStorageConnection();
private:
// single instance to handle all client access
static MemStorageManager* instance;
// keep track of the previously used DB.
// If we still have the same DB the MemUpdateStoragePtr remains valid
std::string lastUsedDatabase;
// synchronize creation of MemUpdateStorages:
boost::interprocess::named_mutex storage_create_guard;
// Pointer to MemUpdateStorage for currentDatabase
MemUpdateStoragePtr memUpdateStoragePtr;
// Pointer to transaction logger for in-memory updates
DbUpdateLoggerPtr dbUpdateLoggerPtr;
std::string smiLogFileName;
};
} /* namespace temporal2algebra */
#endif /* ALGEBRAS_TEMPORAL2_MEMSTORAGEMANAGER_H_ */