GlobalObjects
|
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 für mehreren Instanzen im Mehrbenutzerbtrieb gewährleistet werden.
Man kann einzelne Objekte, Gruppen von Objekten in Containern und ganze AllSets beobachten und sich bei Änderungen benachrichtigen lassen. Es können Operationen in der Objektdatenbank die länger dauern, beobachtet werden und man kann sich über den Fortschritt benachrichtigen lassen. Zusätzlich ist es möglich, das Öffnen bzw. Schließen einer Objektdatenbank anderer Clients zu beobachten.
Es muss zum Beobachten ein Objekt, abgeleitet von glo::CallBack, an die jeweilige Beobachtungsmethode übergeben werden. Damit die Benachrichtigung bearbeitet wird, muss die virtuelle Methode glo::CallBack::notify(glo::NotifyNote & rNote) für die Auswertung der glo::NotifyNote überschrieben werden.
Grundsätzlich wird bei einer Beobachtung auch die beobachtende Instanz, welche die Änderung bzw. das Ereignis selbst ausgelöst hat, benachrichtigt.
Ein einzelnes Objekt kann auf vielfältige Weise zur Beobachtung an die Objektdatenbank übergeben werden. Dieses kann wahlweise über glo::Persistent::setWatch (...), glo::TOndemand::setWatch (...) oder glo::Base::setWatchObject (...) initiiert werden.
Wenn Objekte einer persistenten Klasse 'X', abgeleitet von glo::Persistent, sich selbst beobachten sollen (ggf. um sich bei einer Änderung einer anderen Instanz durch glo::Persistent::refresh() die aktuellen Attributdaten aus der Datenbank einzulesen), reicht es in 'X' die von glo::CallBack geerbte Methode glo::CallBack::notify( glo::NotifyNote & rNote ) zu überschreiben ( glo::Persistent ist von glo::CallBack abgeleitet und kann somit auch benachrichtigt werden).
Es empfiehlt sich, bei der überschriebenen Notify-Methode in der Klasse 'X' den Bezeichner "override" zu verwenden.
Beispiel:
Um die Beobachtung mit sich selbst als glo::NotifyNote empfangendes Objekt zu initiieren, wird glo::Persistent::setWatch (…) und glo::Persistent::unsetWatch (…) ohne einen Zeiger auf ein glo::CallBack als Parameter aufgerufen.
Beispiel:
Eine weitere Möglichkeit besteht, indem eine glo::TPointerList, ein glo::TPointerSet, eine glo::TOndemandList oder ein glo::TOndemandSet 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.
Eine Gruppen von persistenten Objekten kann mit Übergabe einer Unterklasse von glo::BaseLot an Methode glo::Base::setWatchLot (...) bzw. den direkten Aufruf von glo::BaseLot::setWatch(glo::TdWatchNotifyMode, glo::EnDeepMode, glo::CallBack*) bzw. glo::BaseLot::setWatch(const glo::WatchSpecification&) beobachtet werden (glo::BaseLot ist die Oberklasse von glo::TOndemandList, glo::TOndemandSet, glo::TPointerList und glo::TPointerSet).
Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:
glo::NotifNote Attribut | Inhalt |
---|---|
glo::NotifyNote::m_ulNotifyMode | Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n). Mögliche Werte sind:
|
glo::NotifyNote::m_ipCallBack | Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen. |
glo::NotifyNote::m_nSocket | Enthält keine Information. |
glo::NotifyNote::m_uiCommunicatorID | Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ). |
glo::NotifyNote::m_strClientName | Der Name des auslösenden Clients. |
glo::NotifyNote::m_ObjID | Die glo::ObjID des Objektes, auf dem die Aktion glo::NotifyNote::m_ulNotifyMode ausgeführt wurde. |
glo::NotifyNote::m_uiInfo | Enthält keine Information. |
glo::NotifyNote::m_uiInfo2 | Enthält keine Information. |
glo::NotifyNote::m_strInfo | Enthält keine Information. |
glo::NotifyNote::m_strInfo2 | Enthält keine Information. |
In einem glo::TAllSet (alle persistenten Objekte eines Typs in der Objektdatenbank) können die Objekt eingeschränkt nur flach beobachtet werden (es wird kein glo::EnDeepMode übergeben). Zusätzlich gibt es die Möglichkeit, dass sich die aufrufende Instanz benachrichtigen lässt, wenn ein neues Objekt gespeichert, also in den glo::TAllSet eingefügt wird. Dieses kann wahlweise über glo::TAllSet::setWatch(glo::TdWatchNotifyMode, glo::CallBack*) oder glo::Base::setWatchClass (...) initiiert werden.
Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:
glo::NotifNote Attribut | Inhalt |
---|---|
glo::NotifyNote::m_ulNotifyMode | Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n). Mögliche Werte sind:
|
glo::NotifyNote::m_ipCallBack | Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen. |
glo::NotifyNote::m_nSocket | Enthält keine Information. |
glo::NotifyNote::m_uiCommunicatorID | Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ). |
glo::NotifyNote::m_strClientName | Der Name des auslösenden Clients. |
glo::NotifyNote::m_ObjID | Die glo::ObjID des Objektes, auf dem die Aktion glo::NotifyNote::m_ulNotifyMode ausgeführt wurde. |
glo::NotifyNote::m_uiInfo | Enthält keine Information. |
glo::NotifyNote::m_uiInfo2 | Enthält keine Information. |
glo::NotifyNote::m_strInfo | Enthält keine Information. |
glo::NotifyNote::m_strInfo2 | Enthält keine Information. |
Ist man mit einem GloServer verbunden, kann beobachtet werden, welche Clients sich mit diesem GloServer verbinden. Dieses wird über die Methode glo::Base::setWatchClient (...) mit den Parametern glo::WNM_CLIENT_CONNECTSERVER bzw. glo::WNM_CLIENT_DISCONNECTSERVER initiiert.
Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:
glo::NotifNote Attribut | Inhalt |
---|---|
glo::NotifyNote::m_ulNotifyMode | Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n). Mögliche Werte sind:
|
glo::NotifyNote::m_ipCallBack | Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen. |
glo::NotifyNote::m_nSocket | Der SOCKET des auslösenden Clients. |
glo::NotifyNote::m_uiCommunicatorID | Ist 0, da diese erst mit dem Öffnen einer Objektdatenbank vergeben wird. |
glo::NotifyNote::m_strClientName | Enthält keine Information, da die Clientbezeichnung erst mit dem Öffnen einer Objektdatenbank vergeben wird. |
glo::NotifyNote::m_ObjID | Enthält keine Information. |
glo::NotifyNote::m_uiInfo | Enthält keine Information. |
glo::NotifyNote::m_uiInfo2 | Enthält keine Information. |
glo::NotifyNote::m_strInfo | Enthält keine Information. |
glo::NotifyNote::m_strInfo2 | IP-Adresse (ggf. in einen Namen aufgelöst) des auslösenden Clients. |
Ist man mit einem GloServer verbunden, kann beobachtet werden, welche Clients welche Objektdatenbank öffnen und schließen. Dieses wird über die Methode glo::Base::setWatchClient (...) mit den Parametern glo::WNM_CLIENT_OPENBASE bzw. glo::WNM_CLIENT_CLOSEBASE initiiert.
Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:
glo::NotifNote Attribut | Inhalt |
---|---|
glo::NotifyNote::m_ulNotifyMode | Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n). Mögliche Werte sind:
|
glo::NotifyNote::m_ipCallBack | Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen. |
glo::NotifyNote::m_nSocket | Der SOCKET des auslösenden Clients. |
glo::NotifyNote::m_uiCommunicatorID | Die eindeutige CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ). |
glo::NotifyNote::m_strClientName | Der Name des auslösenden Clients. |
glo::NotifyNote::m_ObjID | Enthält keine Information. |
glo::NotifyNote::m_uiInfo | Enthält keine Information. |
glo::NotifyNote::m_uiInfo2 | Enthält keine Information. |
glo::NotifyNote::m_strInfo | Bezeichnung der geöffneten/geschlossenen Objektdatenbank. |
glo::NotifyNote::m_strInfo2 | IP-Adresse (ggf. in einen Namen aufgelöst) des auslösenden Clients. |
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 den Aufrufen von glo::Base::open (...) und glo::Base::close (...), bzw. glo::Base::openBase (...) und glo::Base::closeBase (...) lediglich ein entsprechendes glo::CallBack -Objekt übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.
Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:
glo::NotifNote Attribut | Inhalt |
---|---|
glo::NotifyNote::m_ulNotifyMode | Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n). Mögliche Werte sind:
|
glo::NotifyNote::m_ipCallBack | Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen. |
glo::NotifyNote::m_nSocket | Enthält keine Information. |
glo::NotifyNote::m_uiCommunicatorID | Die eigene CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ). |
glo::NotifyNote::m_strClientName | Der Name des auslösenden Clients. |
glo::NotifyNote::m_ObjID | Der Index der KlassenID in der glo::ObjID wird aktuell gelesen bzw. geschrieben. Alle Wechsel dieses Wertes ergeben die Anzahl der Aktionen aus glo::NotifyNote::m_uiInfo2. |
glo::NotifyNote::m_uiInfo | Der prozentuale Anteil des schon eingelesenen bzw. geschriebenen aktuellen Indexes. |
glo::NotifyNote::m_uiInfo2 | Anzahl der Indexe, die gelesen, bzw. geschrieben werden. |
glo::NotifyNote::m_strInfo | Bezeichnung des eingelesenen bzw. geschriebenen aktuellen Indexes. |
glo::NotifyNote::m_strInfo2 | Enthält keine Information. |
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 den Methoden glo::Base::reindexBase(const std::string&, glo::CallBack* ) bzw. glo::Base::reindexBase(glo::CallBack*) lediglich ein entsprechendes glo::CallBack-Objekt übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.
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 den Methoden glo::Base::compressBase(const std::string&, glo::CallBack*) bzw. glo::Base::compressBase(glo::CallBack*) lediglich ein entsprechendes glo::CallBack-Objekt übergeben werden, welches die Bearbeitung der Fortschritts-Benachrichtigungen vornimmt.
Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:
glo::NotifNote Attribut | Inhalt |
---|---|
glo::NotifyNote::m_ulNotifyMode | Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion ausgeführt wirde. Mögliche Werte sind:
|
glo::NotifyNote::m_ipCallBack | Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen. |
glo::NotifyNote::m_nSocket | Enthält keine Information. |
glo::NotifyNote::m_uiCommunicatorID | Die eigene CommunicatorID des Notify-Auslösers (die eigene CommunicatorID bekommt man über glo::Base::getCommunicatorID() ). |
glo::NotifyNote::m_strClientName | Der Name des auslösenden Clients. |
glo::NotifyNote::m_ObjID | Die KlassenID in der glo::ObjID, deren Tabelle gerade verarbeitet wird. Alle Wechsel dieses Wertes ergeben die Anzahl der Aktionen aus glo::NotifyNote::m_uiInfo2. |
glo::NotifyNote::m_uiInfo | Der prozentuale Anteil der abgeschlossenen Aktionen. |
glo::NotifyNote::m_uiInfo2 | Anzahl der Aktionen. |
glo::NotifyNote::m_strInfo | Die Bezeichnung der Tabelle, welche gerade verarbeitet wird. |
glo::NotifyNote::m_strInfo2 | Enthält keine Information. |
Ist man mit einem GloServer verbunden, kann eine Benachrichtigung initiieren, wenn es zu einen Verbindungsabbruch zu dem GloServer kommt. Dieses wird über die Methode glo::Base::connect (…), glo::Base::reconnect (…) oder glo::Base::setWatchServer (…) initiiert.
Die Benachrichtigung vom Typ glo::NotifyNote transportiert folgende Informationen:
glo::NotifNote Attribut | Inhalt |
---|---|
glo::NotifyNote::m_ulNotifyMode | Der Mode glo::TdWatchNotifyMode sagt aus, welche Aktion(en) ausgeführt wurde(n). Mögliche Werte sind:
|
glo::NotifyNote::m_ipCallBack | Ist in der Regel die Adresse des glo::CallBack-Objekts. Wird genutzt um dessen Methode glo::CallBack::notify (...) mit der glo::NotifyNote aufzurufen. |
glo::NotifyNote::m_nSocket | Enthält keine Information. |
glo::NotifyNote::m_uiCommunicatorID | Enthält keine Information (die eigene CommunicatorID ist durch den Abbruch verloren). |
glo::NotifyNote::m_strClientName | Enthält keine Information, es gibt keinen auslösenden Clients. |
glo::NotifyNote::m_ObjID | Enthält keine Information. |
glo::NotifyNote::m_uiInfo | Enthält keine Information. |
glo::NotifyNote::m_uiInfo2 | Die Port-Nummer des GloServer, zu dem die Verbindung abgebrochen ist. |
glo::NotifyNote::m_strInfo | Enthält keine Information. |
glo::NotifyNote::m_strInfo2 | IP-Adresse (ggf. in einen Namen aufgelöst) des GloServer, zu dem die Verbindung abgebrochen ist. |