GloServer
GloServer 0.1.5 Benutzer-Anleitung

Einleitung

Was wären globale Objekte, wenn nicht mehrere Instanzen bzw. Clients auf diese gleichzeitig zugreifen könnten. Dafür ist das Programm GloServer.exe vorhanden.

Der GlobalObjectsServer ist eine typische Konsolen-Anwendung.

Der GlobalObjectsServer nach dem ersten Start:

Einstellungen

Damit der GlobalObjectsServer arbeiten kann, müssen ihm über einer INI-Datei einige Einstellungen mitgeteilt werden. Wenn keine INI-Datei übergeben ist, wird als Voreinstellung eine DB.ini im selben Verzeichnis vom GlobalObjectsServer erwartet. Diese INI-Datei hat folgenden Aufbau:

[Server]
Port=4000
TcpPackageSize=4096
BasePath=D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/
KnownBases=MyFirstBase|BigExample
TimeOutSec=0

Der GlobalObjectsServer wie auch die Client-Anwendungen müssen über einen gemeinsamen Port mit einer gemeinsamen TcpPackageSize kommunizieren.
Mit der Einstellung in BasePath wird der vollständige Pfad angegeben, in denen die GlobalObjects-Schemata liegen.
Der GlobalObjectsServer berücksichtigt nur die Datenbanken, welche unter KnownBases aufgeführt sind. Die einzelnen Bezeichnungen werden mit einem '|' getrennt.
Der Wert unter TimeOutSec gibt die Sekunden an, die ein Client auf eine Antwort wartet. Ist die Zeit abgelaufen, wird das Warten auf eine Antwort abgebrochen und ein Fehler generiert. Ein Wert von 0 lässt den Client theoretisch unendlich warten, was z.B. beim 'debugen' der Anwendung vorteilhaft ist.

Steuerung

Der GlobalObjectsServer kann bedingt über einige Befehle gesteuert werden.

Hilfe

Mit der Taste [?] bzw. dem Befehlswort 'help' werden die überschaubaren Eingabemöglichkeiten angezeigt.

Bildschirm löschen

Mit den Befehlswörtern 'cls' oder 'clear' wird der Bildschirm gelöscht.

Beenden

Mit der Taste [q] bzw. dem Befehlswörtern 'quit' oder 'exit' wird der GlobalObjectsServer beendet. Sollten noch Clients mit dem GlobalObjectsServer verbunden sein, muss nochmals bestätigt werden.

Achtung
Wenn Clients, die mit dem GlobalObjectsServer verbunden sind, Datenbanken geöffnet haben, werden deren Indexe beim beenden nicht gesichert, so dass ein Reindizieren notwendig ist.

Info

Mit der Taste [i] bzw. dem Befehlswort 'info' werden die GloServer Einstellungen angezeigt.

Anzeigestatus

Mit dem Befehlswort 'sl' wird der Anzeigestatus angezeigt. Dieser wird einfach als Ziffer eingegeben.

Um z.B. den Anzeigestatus '2' -> shows read/write table-actions und '4' -> shows order-actions zu aktivieren, werden die Status 2 und 4 zu 6 addiert und eingegeben.

'0' -> don't show any actions

Es wird keine Aktion angezeigt.

'1' -> shows tcp-actions

Es wird angezeigt, wenn sich ein Client am GlobalObjectsServer an- bzw. abmeldet.

'2' -> shows read/write table-actions

Es wird angezeigt, wenn ein Client etwas aus der Datenbank liest bzw. in die Datenbank schreibt.

Diese Anzeige resultiert aus folgendem Code-Schnipsel:

std::shared_ptr<MyTestClass> t_spShowPersObject;
GloTAllSet<MyTestClass> t_AllSet( t_Base ); // t_Base (GloBase) is open!
t_iErr = t_ AllSet->get( t_spShowPersObject, GloSTART );
if ( ! t_iErr )
{
do
{
// do something
t_iErr = AllSet->get( t_spShowPersObject, GloNEXT );
} while ( ! t_iErr );
t_iErr = ( t_iErr == GloERR_RANGE ? 0 : t_iErr );
}

RE >: ClientID=2 ClientName=TestClient Schema=MyFirstGloBase Action=eOPENALLSET ClassID=2 Err=0
Es wird für einen bestimmten Client angefragt (RE >), einen AllSet der Klasse mit der ID 2 zu öffnen,...
RE <: ClientID=2 ClientName=TestClient Schema=MyFirstGloBase Action=eOPENALLSET ClassID=2 Err=0
...welches ohne Fehler getan wurde (RE <).

RE >: ClientID=2 ClientName=TestClient Schema=MyFirstGloBase Action=eGET_OBJID_WITH_OBJECT_FROM_ALLSET ObjID=2.0.27 Err=0
Es wurde eine Anfrage nach einer Obj-ID und dem dazugehörigen Objekt initiiert. Die Objekt-ID ist zumindest schon mal gefunden worden.
RDR -> Table: D:/Projects/GlobalObjects xx.xx/GloExamples/Bases/MyFirstGloBase/MyTestClass ObjID=2.0.27 Err=0
Aus der Tabelle 'MyTestClass' wurde der anteilige Datensatz vom Objekt 2.0.27 gelesen.
RDR -> Table: D:/Projects/GlobalObjects xx.xx/GloExamples/Bases/MyFirstGloBase/FirstGloBase ObjID=2.0.27 Err=0
Aus der Tabelle 'FirstGloBase' wurde der anteilige Datensatz vom Objekt 2.0.27 gelesen.
RDR -> Ext.File: 4.1.4/4.0.28 Err=0
Es wurde die externe Datei '4.0.28' im Unterverzeichnis '4.1' gelesen. Dies sind die Daten eines Attributs des nächsten zu liefernden Objekts, um diese in den noch zu lesenden Datensatz einzufügen.
RDR -> Table: D:/Projects/GlobalObjects xx.xx/GloExamples/Bases/MyFirstGloBase/EmbeddedClass ObjID=4.0.28 Err=0
Aus der Tabelle 'EmbeddedClass' wurde der anteilige Datensatz vom Objekt 4.0.28 gelesen (das Objekt mit der Objekt-ID 2.0.27 hat dieses Objekt eingebettetes).
RDR -> Table: D:/Projects/GlobalObjects xx.xx/GloExamples/Bases/MyFirstGloBase/FirstGloBase ObjID=4.0.28 Err=0
Aus der Tabelle 'FirstGloBase' wurde der anteilige Datensatz vom Objekt 4.0.28 gelesen.
RE <: ClientID=2 ClientName=TestClient Schema=MyFirstGloBase Action=eGET_OBJID_WITH_OBJECT_FROM_ALLSET ObjID=2.0.27 Err=0
Dieses signalisieren, dass eine Objekt-ID 2.2.1 und das zugehörige Objekt ohne Fehler gelesen wurden.
RE !: ClientID=2 ClientName=TestClient Schema=MyFirstGloBase Action=eGET_OBJID_WITH_OBJECT_FROM_ALLSET ObjID=0.0.0 Err=-13032
zeigen an, dass eine weitere Anfrage nach einer Objekt-ID fehlgeschlagen ist (Der AllSet der Klasse mit der Klassen-ID 2 hat in diesem Beispiel nur ein Objekt).
RE >: ClientID=2 ClientName=TestClient Schema=SchemaExample Action=eCLOSEALLSET ClassID=2 Err=0
RE <: ClientID=2 ClientName=TestClient Schema=SchemaExample Action=eCLOSEALLSET ClassID=2 Err=0
Der AllSet wurde erfolgreich geschlossen.


Ein weiteres Beispiel aus folgendem Code-Schnipsel:

...
MyTestClass * t_pPersObject = nullptr;
...
t_iErr = t_pPersObject->store();
...

MyTestClass hat als Attribut ein eingebettetes Objekt vom Typ EmbeddedClass. EmbeddedClass hat ein Attribut vom Typ std::string welches in der Länge nicht eingeschränkt ist. In diesem Beispiel ist die Zeichenkette so lang, dass sie in eine externe Datei geschrieben wird.

TRX [: ClientID=1 ClientName=TestClient Schema=MyFirstGloBase Action=eSTORE Err=0
Das Speichern eines Objektes findet in einer Transaktion statt. Dieses ist der Beginn der Transaktion (TRX [).
WR >: ClientID=1 ClientName=TestClient Schema=MyFirstGloBase Action=ePROCESSTRANSACTION ObjID=2.0.27 Err=0
Es wird für den Client mit der ID 1 das Speichern des Objektes mit der Objekt-ID 2.0.25 gestartet (WR >). Da Objekte über mehrere Dateien verteilt sind, findet das Speichern jedes einzelnen Objekts in einer inneren Transaktion statt (Action=ePROCESSTRANSACTION).
WRI -> Table: D:/Projects/GlobalObjects xx.xx/GloExamples/Bases/MyFirstGloBase/FirstGloBase ObjID=2.0.27 Err=0
Es wurden die anteiligen Daten vom Objekt mit der ID 2.0.27 in die Tabelle 'FirstGloBase' geschrieben.
WRI -> Table: D:/Projects/GlobalObjects xx.xx/GloExamples/Bases/MyFirstGloBase/MyTestClass ObjID=2.0.27 Err=0
Es wurden die anteiligen Daten vom Objekt mit der ID 2.0.27 in die Tabelle 'MyTestClass' geschrieben.
WR <: ClientID=1 ClientName=TestClient Schema=MyFirstGloBase Action=ePROCESSTRANSACTION ObjID=2.0.27 Err=0
Das Speichern des Objektes als solches wurde erfolgreich in der inneren Transaktion ohne Fehler abgeschlossen.

Jetzt fehlt noch das eingebettete Objekt (4.0.28):
WR >: ClientID=1 ClientName=TestClient Schema=MyFirstGloBase Action=ePROCESSTRANSACTION ObjID=4.0.28 Err=0
Das Speichern des eingebetteten Objekts mit der Objekt-ID 4.0.28 findet wieder in einer inneren Transaktion statt.
WRI -> Table: D:/Projects/GlobalObjects xx.xx/GloExamples/Bases/MyFirstGloBase/FirstGloBase ObjID=4.0.28 Err=0
Es wurden die anteiligen Daten vom Objekt mit der ID 4.0.28 in die Tabelle 'FirstGloBase' geschrieben.
WRI -> Ext.File: 4.1/4.0.28 Err=0
Des Weiteren wurden die Daten aus dem String-Attribut des Objektes mit der Objet-ID 4.0.28 in die externe Datei '4.0.28' in das Unterverzeichnis '4.1' geschrieben.
WRI -> Table: D:/Projects/GlobalObjects xx.xx/GloExamples/Bases/MyFirstGloBase/EmbeddedClass ObjID=4.0.28 Err=0
Es wurden die anteiligen Daten vom Objekt mit der ID 4.0.28 in die Tabelle 'EmbeddedClass' geschrieben.
WR <: ClientID=1 ClientName=TestClient Schema=MyFirstGloBase Action=ePROCESSTRANSACTION ObjID=4.0.28 Err=0
Das Speichern des Objektes als solches wurde erfolgreich in der inneren Transaktion ohne Fehler abgeschlossen.
TRX ]: ClientID=1 ClientName=TestClient Schema=MyFirstGloBase Action=eSTORE Err=0
Da keine Fehler aufgetreten sind, wurde die Speicher-Transaktion abgeschlossen, alles ist gespeichert.

'4' -> shows order-actions

Es wird angezeigt, welche Anfragen ein Client an den GlobalObjectsServer sendet.

Diese Anzeige resultiert aus folgendem Code-Schnipsel:

std::shared_ptr<MyTestClass> t_spShowPersObject;
GloTAllSet<MyTestClass> t_AllSet( t_Base ); // t_Base (GloBase) is open!
t_iErr = t_ AllSet->get( t_spShowPersObject, GloSTART );
if ( ! t_iErr )
{
do
{
// do something
t_iErr = AllSet->get( t_spShowPersObject, GloNEXT );
} while ( ! t_iErr );
t_iErr = ( t_iErr == GloERR_RANGE ? 0 : t_iErr );
}

'8' -> shows reindex-actions

Es wird angezeigt, wenn eine Datenbank reindiziert wird.

'16' -> shows read index-actions

Es wird angezeigt, wenn eine Datenbank geöffnet und der Index eingelesen wird.

'32' -> shows write index-actions

Es wird angezeigt, wenn eine Datenbank geschlossen und der Index gesichert wird.