GlobalObjects
Persistente Objekte beobachten / benachrichtigen

Grundsätzliches

Um über Änderungen und Zustände in der Objektdatenbank informiert zu sein, steht ein umfangreiches Benachrichtigungssystem in GlobalObjects zur Verfügung. Damit kann unter anderem die Konsistenz einzelner Objekte in mehreren Instanzen im Mehrbenutzerbtrieb gewährleistet werden.

Man kann einzelne Objekte, Gruppen von Objekten in Container vom Typ GloTPointerList, GloTPointerSet, GloTOndemandList und GloTOndemandSet und ganze AllSets beobachten lassen und sich bei Änderungen benachrichtigen lassen. Es können Operationen in der Objektdatenbank, die länger dauern, beobachtet werden und sich über den Fortschritt benachrichtigen lassen. Zusätzlich ist es möglich, das Öffnen bzw. Schließen einer Objektdatenbank von einem Clients zu beobachten.

Es muss zum Beobachten ein Objekt, abgeleitet von GloCallBack, an die jeweilige Beobachtungsmethode übergeben werden. Damit die Benachrichtigung bearbeitet wird, muss die virtuelle Methode GloCallBack::notify(GloNotifyNote & rNote) für die Auswertung der GloNotifyNote überschrieben werden.

Siehe auch
Beispielklasse abgeleitet von GloCallBack

Grundsätzlich wird bei einer Beobachtung auch die beobachtende Instanz, welche die Änderung bzw. das Ereignis selbst ausgelöst hat, benachrichtigt.

Zu beachten
Die Beobachtungsfunktionalität liefert auch im Einzelbenutzerbetrieb valide Ergebnisse (es kann wie im Mehrbenutzerbtrieb eine Beobachtung gesetzt werden).

Ein persistentes Objekt beobachten

Ein einzelnes Objekt kann auf vielfältige Weise zur Beobachtung an die Objektdatenbank übergeben werden. Dieses kann wahlweise über GloBasePersistent::setWatch (...), GloReference::setWatch (...) oder GloBase::setWatchObject (...) initiiert werden.

Eine weitere Möglichkeit besteht, indem eine GloTPointerList, ein GloTPointerSet, eine GloTOndemandList oder ein GloTOndemandSet genutzt wird. In diesen Containern kann eine Beobachtung gesetzt werden. Jedes Objekt, welches man in den Containern einfügt wird automatisch mit dem Beobachtungsmodus des Containers beobachtet, bzw. es wird die Beobachtung beendet wenn es aus dem Container entfernt wird.

Zu beachten
Ggf. werden referenzierte Objekte mitbeobachtet, wenn über dass Schlüsselwort dependent (siehe auch in Tabelle Glo-Datentypen in Spalte TypInfo) eingestellt und der Beobachtungstiefenmodus GloEnDeepMode dementsprechend ist. Dieses gilt auch für die folgenden Ausführungen wenn mehrere Objekte gleichzeitig beobachtet werden.
Achtung
Eine Beobachtung muss mit den gleichen Parametern aufgehoben werden. Das kann wiederum wahlweise über GloBasePersistent::unsetWatch (...), GloReference::unsetWatch (...) oder GloBase::unsetWatchObject (...) geschehen.

Mehrere persistente Objekte beobachten

Eine Gruppen von persistenten Objekten kann mit Übergabe einer Unterklasse von GloBaseSet an Methode GloBase::setWatchList (...) bzw. den direkten Aufruf von GloBaseLot::setWatch(GloTdWatchNotifyMode iWatchMode, GloEnDeepMode eDeepMode, GloCallBack * pCallBack) bzw. GloBaseLot::setWatch(const GloWatchSpecification & rWatchSpec) beobachtet werden.

Zu beachten
Ggf. werden referenzierte Objekte mitbeobachtet, wenn über dass Schlüsselwort dependent (siehe auch in Tabelle Glo-Datentypen in Spalte TypInfo) eingestellt und der Beobachtungstiefenmodus GloEnDeepMode dementsprechend ist. Dieses gilt auch für die folgenden Ausführungen wenn mehrere Objekte gleichzeitig beobachtet werden.
Achtung
Die Beobachtung muss mit den gleichen Parametern aufgehoben werden. Das kann wiederum wahlweise über GloBase::unsetWatchLot (...) oder GloBaseLot::unsetWatch(GloTdWatchNotifyMode iWatchMode, GloEnDeepMode eDeepMode, GloCallBack * pCallBack) bzw. GloBaseLot::unsetWatch(const GloWatchSpecification & rWatchSpec) geschehen.

Benachrichtigung für beobachtete Objekte auswerten

Die Benachrichtigung vom Typ GloNotifyNote transportiert folgende Informationen:

GloNotifNote Werte
GloNotifNote Attribut Inhalt
GloNotifyNote::m_ulNotifyMode Der Mode GloTdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
GloNotifyNote::m_ipCallBack Ist in der Regel die Adresse des GloCallBack-Objekts. Wird genutzt um dessen Methode GloCallBack::notify (...) mit der GloNotifyNote aufzurufen.
GloNotifyNote::m_nSocket Enthält keine Information.
GloNotifyNote::m_uiCommunicatorID Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über GloBase::getCommunicatorID() ).
GloNotifyNote::m_strClientName Der Name des auslösenden Clients.
GloNotifyNote::m_ObjID Die GloObjID des Objektes, auf dem die Aktion GloNotifyNote::m_ulNotifyMode ausgeführt wurde.
GloNotifyNote::m_uiInfo Enthält keine Information.
GloNotifyNote::m_strInfo Enthält keine Information.
GloNotifyNote::m_strInfo2 Enthält keine Information.

Einen GloTAllSet beobachten

In einem GloTAllSet (alle persistenten Objekte eines Typs in der Objektdatenbank) können die Objekt eingeschränkt nur flach beobachtet werden (es wird kein GloEnDeepMode übergeben). Zusätzlich gibt es die Möglichkeit, dass sich die aufrufende Instanz benachrichtig lässt, wenn ein neues Objekt gespeichert, also in den GloTAllSet eingefügt wird. Dieses kann wahlweise über GloTAllSet::setWatch(GloTdWatchNotifyMode iWatchMode, GloCallBack * pCallBack) oder GloBase::setWatchClass (...) initiiert werden.

Achtung
Die Beobachtung muss mit den gleichen Parametern aufgehoben werden. Das kann wiederum wahlweise über GloTAllSet::unsetWatch(GloTdWatchNotifyMode iWatchMode, GloCallBack * pCallBack) oder GloBase::unsetWatchClass (...) geschehen.

Benachrichtigung für beobachteten GloTAllSet auswerten

Die Benachrichtigung vom Typ GloNotifyNote transportiert folgende Informationen:

GloNotifNote Werte
GloNotifNote Attribut Inhalt
GloNotifyNote::m_ulNotifyMode Der Mode GloTdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
GloNotifyNote::m_ipCallBack Ist in der Regel die Adresse des GloCallBack-Objekts. Wird genutzt um dessen Methode GloCallBack::notify (...) mit der GloNotifyNote aufzurufen.
GloNotifyNote::m_nSocket Enthält keine Information.
GloNotifyNote::m_uiCommunicatorID Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über GloBase::getCommunicatorID() ).
GloNotifyNote::m_strClientName Der Name des auslösenden Clients.
GloNotifyNote::m_ObjID Die GloObjID des Objektes, auf dem die Aktion GloNotifyNote::m_ulNotifyMode ausgeführt wurde.
GloNotifyNote::m_uiInfo Enthält keine Information.
GloNotifyNote::m_strInfo Enthält keine Information.
GloNotifyNote::m_strInfo2 Enthält keine Information.

Den Verbindungsauf- bzw. -abbau an eine GloServer beobachten

Ist man mit einer Objektdatenbank verbunden, kann beobachtet werden, welche Clients diese öffnen und schließen. Dieses wird über die Methode GloBase::setWatchClient (...) initiiert.

Achtung
Die Beobachtung muss mit den gleichen Parametern über GloBase::unsetWatchClient (...) aufgehoben werden.

Benachrichtigung für beobachtete Verbindungsauf- bzw. -abbau an einen GloServer auswerten

Die Benachrichtigung vom Typ GloNotifyNote transportiert folgende Informationen:

GloNotifNote Werte
GloNotifNote Attribut Inhalt
GloNotifyNote::m_ulNotifyMode Der Mode GloTdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
GloNotifyNote::m_ipCallBack Ist in der Regel die Adresse des GloCallBack-Objekts. Wird genutzt um dessen Methode GloCallBack::notify (...) mit der GloNotifyNote aufzurufen.
GloNotifyNote::m_nSocket Der SOCKET des auslösenden Clients.
GloNotifyNote::m_uiCommunicatorID Ist 0, da diese erst mit dem Öffnen einer Objektdatenbank vergeben wird.
GloNotifyNote::m_strClientName Enthält keine Information, da die Clientbezeichnung erst mit dem Öffnen einer Objektdatenbank vergeben wird.
GloNotifyNote::m_ObjID Enthält keine Information.
GloNotifyNote::m_uiInfo Enthält keine Information.
GloNotifyNote::m_strInfo Enthält keine Information.
GloNotifyNote::m_strInfo2 IP-Adresse (ggf. in einen Namen aufgelöst) des auslösenden Clients.

Das Öffnen und Schließen einer Objektdatenbank beobachten

Ist man mit einer Objektdatenbank verbunden, kann beobachtet werden, welche Clients dieses öffnen und schließen. Dieses wird über die Methode GloBase::setWatchClient (...) initiiert.

Achtung
Die Beobachtung muss mit den gleichen Parametern über GloBase::unsetWatchClient (...) aufgehoben werden.

Benachrichtigung für beobachtetes Öffnen und Schließen einer Objektdatenbank auswerten

Die Benachrichtigung vom Typ GloNotifyNote transportiert folgende Informationen:

GloNotifNote Werte
GloNotifNote Attribut Inhalt
GloNotifyNote::m_ulNotifyMode Der Mode GloTdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
GloNotifyNote::m_ipCallBack Ist in der Regel die Adresse des GloCallBack-Objekts. Wird genutzt um dessen Methode GloCallBack::notify (...) mit der GloNotifyNote aufzurufen.
GloNotifyNote::m_nSocket Der SOCKET des auslösenden Clients.
GloNotifyNote::m_uiCommunicatorID Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über GloBase::getCommunicatorID() ).
GloNotifyNote::m_strClientName Der Name des auslösenden Clients.
GloNotifyNote::m_ObjID Enthält keine Information.
GloNotifyNote::m_uiInfo Enthält keine Information.
GloNotifyNote::m_strInfo Bezeichnung der geöffneten/geschlossenen Objektdatenbank.
GloNotifyNote::m_strInfo2 IP-Adresse (ggf. in einen Namen aufgelöst) des auslösenden Clients.

Über Lesen und Schreiben der Indexe benachrichtigen lassen

Das Einlesen und Schreiben der Indexe kann etwas länger dauern. Wird eine Objektdatenbank geöffnet, wird der Index (wenn nicht schon geschehen) eingelesen. Damit der Anwender nicht das Gefühl bekommt, dass die Anwendung "eingefroren ist", kann sich die Applikation über den Fortschritt des Einlesens informieren lassen und dieses dem Anwender anzeigen.
Um sich über den Fortschritt des Einlesens informieren zu lassen, muss der GloBase::open (...) und GloBase::close (...), bzw. GloBase::openBase (...) und GloBase::closeBase (...) ein entsprechendes GloCallBack -Objekt mit übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.

Achtung
Diese Beobachtung muss nicht aufgehoben werden, sondern wird automatisch nach dem Einlesen bzw. Schreiben des Indexes beendet.

Benachrichtigung des Lesens und Schreibens der Indexe auswerten

Die Benachrichtigung vom Typ GloNotifyNote transportiert folgende Informationen:

GloNotifNote Werte
GloNotifNote Attribut Inhalt
GloNotifyNote::m_ulNotifyMode Der Mode GloTdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
GloNotifyNote::m_ipCallBack Ist in der Regel die Adresse des GloCallBack-Objekts. Wird genutzt um dessen Methode GloCallBack::notify (...) mit der GloNotifyNote aufzurufen.
GloNotifyNote::m_nSocket Enthält keine Information.
GloNotifyNote::m_uiCommunicatorID I.d.R. Die eigene CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über GloBase::getCommunicatorID() ).
GloNotifyNote::m_strClientName Der Name des auslösenden Clients.
GloNotifyNote::m_ObjID Der Index der KlassenID in der GloObjID wird aktuell gelesen bzw. geschrieben.
GloNotifyNote::m_uiInfo Der prozentuale Anteil des schon eingelesenen bzw. geschriebenen aktuellen Indexes.
GloNotifyNote::m_strInfo Bezeichnung des eingelesenen bzw. geschriebenen aktuellen Indexes.
GloNotifyNote::m_strInfo2 Enthält keine Information.

Über das Neuindizieren benachrichtigen lassen

Ist man mit einer Objektdatenbank verbunden, können die Indexe neu indiziert werden, z.B. wenn diese 'korrupt' sind. Dieser Vorgang kann je nach Objektmenge länger dauern. Auch hier kann der Fortschritt angezeigt werden. Dafür muss der Methode GloBase::reindexBase(const std::string & rstrBaseName, GloCallBack * pCallBack ) bzw. GloBase::reindexBase(GloCallBack * pCallBack) ein entsprechendes GloCallBack-Objekt mit übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.

Achtung
Diese Beobachtung muss nicht aufgehoben werden, sondern wird automatisch nach dem Neuindizieren des Indexes beendet.

Über das Komprimieren benachrichtigen lassen

Ist man mit einer Objektdatenbank verbunden, können die Tabellen komprimiert werden, es werden die Einträge der gelöschten Objekte aus den Tabellen entfernt. Da es zum Index der vorhandenen Objekte auch einen Index der gelöschten Objekte gibt, kann letzterer Index entsorgt werden, wenn die gelöschten Einträge in den Tabellen entfernt sind. Dieser Vorgang kann je nach Objektmenge länger dauern. Auch hier kann der Fortschritt angezeigt werden. Dafür muss der Methode GloBase::compressBase(const std::string & rstrBaseName, GloCallBack * pCallBack ) bzw. GloBase::compressBase(GloCallBack * pCallBack) ein entsprechendes GloCallBack-Objekt mit übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.

Achtung
Diese Beobachtung muss nicht aufgehoben werden, sondern wird automatisch nach dem Neuindizieren des Indexes beendet.

Benachrichtigung einer Fortschrittsanzeige auswerten

Die Benachrichtigung vom Typ GloNotifyNote transportiert folgende Informationen:

GloNotifNote Werte
GloNotifNote Attribut Inhalt
GloNotifyNote::m_ulNotifyMode Der Mode GloTdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n).
Mögliche Werte sind:
GloNotifyNote::m_ipCallBack Ist in der Regel die Adresse des GloCallBack-Objekts. Wird genutzt um dessen Methode GloCallBack::notify (...) mit der GloNotifyNote aufzurufen.
GloNotifyNote::m_nSocket Enthält keine Information.
GloNotifyNote::m_uiCommunicatorID I.d.R. Die eigene CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über GloBase::getCommunicatorID() ).
GloNotifyNote::m_strClientName Der Name des auslösenden Clients.
GloNotifyNote::m_ObjID Die KlassenID in der GloObjID, deren Tabelle gerade verarbeitet wird
GloNotifyNote::m_uiInfo Der prozentuale Anteil des schon neu erstellten Indexes.
GloNotifyNote::m_strInfo Die Tabellenbezeichnung, welche gerade verarbeitet wird..
GloNotifyNote::m_strInfo2 Enthält keine Information.