GlobalObjects
|
Objekte dieser Klasse überwachen den Sperrzustand von Objekten. Mehr ...
#include <GloLockManager.h>
Klassen | |
class | LockedObject |
Objekte können gesperrt werden. Objekte dieser Klasse repräsentiert ein vom Kommunikatoren gesperrtes Objekt, mit ggf. mit gesperrten Objekten wie z.B. eingebettete Objekte. Mehr ... | |
Öffentliche Methoden | |
LockManager (Manager *pDBManager) | |
virtual | ~LockManager () |
void | deleteAllLocks (Communicator *pCommunicator, const std::string &rsSchemaName) |
void | getNotAllowedReadObjects (std::list< ObjID > &rReadLockObjList, const TransactionOwner &rCommunicatorWithTreadID) const |
LockPossibleSpecification | getProcessingPossibilities (const ObjID &rObjID, std::map< ObjID, Record *, std::less< ObjID > > &rDependObjects, const TransactionOwner &rCommunicatorWithTreadID) |
bool | isPossible (const ObjID &rObjID, std::map< ObjID, Record *, std::less< ObjID > > &rDependObjects, const TransactionOwner &rCommunicatorWithTreadID, bool bRead, bool bWrite, bool bDelete) |
int | lockObject (const ObjID &rObjID, std::map< ObjID, Record *, std::less< ObjID > > &rDependObjects, const TransactionOwner &rCommunicatorWithTreadID, const std::string &rsSchemaName, EnLockMode eLockMode, EnDeepMode eDeepMode, bool bSimulate=false) |
int | unlockObject (const ObjID &rObjID, const TransactionOwner &rCommunicatorWithTreadID, const std::string &rsSchemaName, EnLockMode eLockMode, EnDeepMode eDeepMode, bool bSimulate=false) |
Geschützte Methoden | |
LockManager () | |
Private Methoden | |
LockManager (const LockManager &) | |
LockManager & | operator= (const LockManager &) |
void | sendNotify (TdWatchNotifyMode nWatchNotifyMode, const ObjID &rObjID, Communicator *pCommunicator, const std::string &rsSchemaName) |
Private Attribute | |
std::unordered_map< unsigned long, LockedObject * > | m_LockedObjectMap |
Manager * | m_pDBManager |
Objekte dieser Klasse überwachen den Sperrzustand von Objekten.
Es werden keine Sperrzustände in den Tabellen abgelegt. Der Manager muss hier Objekte zum sperren anmelden (mit dem sperrenden bzw. freigebenden Kommunikator) und immer vor Aktionen anfragen, ob diese erlaubt sind. Sperrzustände von einzelnen Objekten können erfragt werden.
Da ein Objekt z.B. mit seinen abhängigen Objekten gesperrt werden können soll, werden Objekte mit ihren abhängigen Objekten zum sperren übergeben. Es wird die Sperrmöglichkeit jedes Objektes geprüft und wenn möglich werden alle Objekte mit übergebenen Sperrmodus gesperrt, oder keines.
Für jeden Sperrmodus gibt es eine Liste, in der die Liste der abhängigen Objekte mit dem Sperrtiefenmodus abgelegt wird.
Wenn ein Objekt mit einem bestimmten Sperrmodus und Sperrtiefenmodus freigegeben wird, wird die Liste aus der Sperrmodus-Liste genommen und die evtl. enthaltenen Objekte auch mit gleichem Sperrmodus freigegeben.
Das ist Notwendig, weil z.B. ein Objekt 'A' mit einem referenzierten Objekt 'B' gesperrt werden kann. Die Anwendung kann nun z.B. das referenzierte Objekt 'B' in Objekt 'A' dereferenzieren. Bei einer Freigabe von Objekt 'A' ist das früher referenzierte Objekt 'B' nicht mehr mit Objekt A verbunden und würde demnach auch nicht mehr freigegeben werden.
In folgender Tabelle sind die einzelnen Sperrmodi mit ihren Auswirkungen aufgelistet.
Es gelten folgende Abkürzungen für die Sperrmodi:
Es gelten folgende Abkürzungen für Aktionen:
Sperrende Instanz | Andere Instanzen | ||||
---|---|---|---|---|---|
Sperrmodus | Garantie zu tun... | Schutz vor... | Elaubte Sperrmodi | Möglichkeiten | Restriktionen |
NN | keine | keinen | alle | alle | keine |
RD | R | D | RD, RW, WW, TW | R, W | D |
RW | R | D, W | RD, RW | R | D, W |
WW | R, W | D, W | RD | R | D, W |
DW | R, W, D | D, W | keine | R | D, W |
DR | R, W, D | D, W, R | keine | keine | D, R, W |
EX | R, W, D | D, W, R | keine | keine | D, R, W |
TW | R, W | D, W | RD | R | D, W |
TD | R, W, D | D, W | keine | R | D, W |
Die Struktur vom LockManager sieht so aus:
|
protected |
Der Standard-Konstruktor steht nicht zur Verfügung.
glo::LockManager::LockManager | ( | Manager * | pDBManager | ) |
Konstruktor mit Parameterübergabe.
[in] | pDBManager | Rückreferenz auf den besitzenden Manager, darf wärend der Lebensdauer dieses Objektes nicht aus dem Speicher entfernt werden. |
|
virtual |
Destruktor, es wird aufgeräumt.
|
private |
Der Copy-Konstruktor steht nicht zur Verfügung.
void glo::LockManager::deleteAllLocks | ( | Communicator * | pCommunicator, |
const std::string & | rsSchemaName ) |
Es werden alle Sperren des übergebenen Kommunikator entfernt.
[in] | pCommunicator | Der Kommunikator. |
[in] | rsSchemaName | Der Schemaname wird für das Benachrichtigen gebraucht. |
void glo::LockManager::getNotAllowedReadObjects | ( | std::list< ObjID > & | rReadLockObjList, |
const TransactionOwner & | rCommunicatorWithTreadID ) const |
Liefert für übergebenen Kommunikator alle Objekt-IDs der lesegesperrten Objekte.
[in,out] | rReadLockObjList | Die Objekt-IDs der lesegesperrten Objekte. |
[in] | rCommunicatorWithTreadID | Der Kommunikator mit Thread-ID. |
LockPossibleSpecification glo::LockManager::getProcessingPossibilities | ( | const ObjID & | rObjID, |
std::map< ObjID, Record *, std::less< ObjID > > & | rDependObjects, | ||
const TransactionOwner & | rCommunicatorWithTreadID ) |
Liefert die möglichen Aktion mit einem Objekt für einen Kommunikator.
[in] | rObjID | Die zu prüfende Objekt-ID. |
[in] | rDependObjects | Die Map von Datensätze der mitzuprüfenden Objekte. |
[in] | rCommunicatorWithTreadID | Der Kommunikator mit Thread-ID. |
bool glo::LockManager::isPossible | ( | const ObjID & | rObjID, |
std::map< ObjID, Record *, std::less< ObjID > > & | rDependObjects, | ||
const TransactionOwner & | rCommunicatorWithTreadID, | ||
bool | bRead, | ||
bool | bWrite, | ||
bool | bDelete ) |
Prüft, ob der übergebenen Kommunikator das Objekt mit übergebener Objekt-ID lesen, schreiben und/oder löschen darf.
[in] | rObjID | Die zu prüfende Objekt-ID. |
[in] | rDependObjects | Die Map von Datensätze der mitzuprüfenden Objekte. |
[in] | rCommunicatorWithTreadID | Der Kommunikator mit Thread-ID. |
[in] | bRead | Wenn true, wird auf 'lesen' geprüft. |
[in] | bWrite | Wenn true, wird auf 'schreiben' geprüft. |
[in] | bDelete | Wenn true, wird auf 'löschen' geprüft. |
int glo::LockManager::lockObject | ( | const ObjID & | rObjID, |
std::map< ObjID, Record *, std::less< ObjID > > & | rDependObjects, | ||
const TransactionOwner & | rCommunicatorWithTreadID, | ||
const std::string & | rsSchemaName, | ||
EnLockMode | eLockMode, | ||
EnDeepMode | eDeepMode, | ||
bool | bSimulate = false ) |
Sperrt ein Objekt mit übergebener Objekt-ID für einen Kommunikators.
[in] | rObjID | Die Objekt-ID des zu sperrenden Objektes. |
[in] | rDependObjects | Die Map von Datensätze der mitzusperrenden Objekte. |
[in] | rCommunicatorWithTreadID | Der sperrende Kommunikator mit Thread-ID. |
[in] | rsSchemaName | Der Schemaname wird für das Benachrichtigen gebraucht. |
[in] | eLockMode | Der Sperrmodus. |
[in] | eDeepMode | Der Sperrtiefenmodus. |
[in] | bSimulate | Wenn true, wird nur simuliert, also kein Wert gesetzt, aber ein valides Ergebnis bzw.ein Fehler geliefert. |
|
private |
Der Zuweisungsoperator steht nicht zur Verfügung.
|
private |
Initiiert über seinen m_pDBManager ein Notify.
[in] | nWatchNotifyMode | Der Überwachungsmodus. |
[in] | rObjID | Die Objekt-ID des betroffenen Objektzs. |
[in] | pCommunicator | Der Kommunikator. |
[in] | rsSchemaName | Der Schemaname wird für das Benachrichtigen gebraucht. |
int glo::LockManager::unlockObject | ( | const ObjID & | rObjID, |
const TransactionOwner & | rCommunicatorWithTreadID, | ||
const std::string & | rsSchemaName, | ||
EnLockMode | eLockMode, | ||
EnDeepMode | eDeepMode, | ||
bool | bSimulate = false ) |
Gibt das von einem Kommunikator gesperrte Objekt mit übergebener Objekt-ID frei.
[in] | rObjID | Die Objekt-ID des freizugebenden Objektes. |
[in] | rCommunicatorWithTreadID | Der freigebende Kommunikator mit Thread-ID. |
[in] | rsSchemaName | Der Schemaname wird für das Benachrichtigen gebraucht. |
[in] | eLockMode | Der Sperrmodus. |
[in] | eDeepMode | Der Sperrtiefenmodus. |
[in] | bSimulate | Wenn true, wird nur simuliert, also kein Wert gesetzt, aber ein valides Ergebnis bzw.ein Fehler geliefert. |
|
private |
Liste der gesperrten Objekte.