GloServer
GloServer (© 1995-2020 Helmut Jakoby)

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|SchemaExample
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, wird nochmals nachgefragt.

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..

Anzeigstatus

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<GloGenericPersistent> t_GenericObject;
GloGenericAllSet * t_pGenericAllSet(0);
t_pGenericAllSet = new GloGenericAllSet( * t_pBase, 2 );
t_iErr = t_pGenericAllSet->get( t_GenericObject, GloSTART );
if ( ! t_iErr )
{
do
{
t_iErr = t_pGenericAllSet->get( t_GenericObject, GloNEXT );
} while ( ! t_iErr );
t_iErr = ( t_iErr == GloERR_RANGE ? 0 : t_iErr );
}
delete t_pGenericAllSet;

RE >: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eOPENALLSET ClassID=2 Err=0
Es wird (RE >) für einen bestimmten Client angefragt, einen AllSet der Klasse mit der ID 2 zu öffnen, ...
RE <: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eOPENALLSET ClassID=2 Err=0
...welches ohne Fehler getan wurde (RE <).
RE >: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eGETOBJIDFROMALLSET ClassID=2 Err=0
und
RE <: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eGETOBJIDFROMALLSET ClassID=2 ObjID=2.2.1 Err=0
signalisieren, dass eine Objekt-ID 2.2.1 ohne Fehler gelesen wurde.

Der folgende Ablauf ist folgendermaßen zu verstehen:
RE >: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eGET ObjID=2.2.1 Err=0
ist die Anfrage ein Objekt mit der Objekt-ID 2.2.1 zu lesen.
RDR -> Ext.File: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/1.txt Err=0
Es wurde die externe Datei '1.txt' gelesen (ist ein Attribut welches in dieser Datei seine Daten hat) um die Daten in den noch zu lesenden Record einzufügen.
RDR -> Table: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/ExampleClass ObjID=2.2.1 Err=0
Aus der Tabelle 'ExampleClass' wurde der Record vom Objekt 2.2.1 gelesen.
RDR -> Table: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/SchemaExample ObjID=2.2.1 Err=0
Aus der Tabelle 'SchemaExample' wurde der Record vom Objekt 2.2.1 gelesen.
RDR -> Table: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/ExampleEmbedetClass ObjID=3.2.2 Err=0
Aus der Tabelle 'ExampleEmbedetClass' wurde der Record vom Objekt 3.2.2 gelesen (das Objekt mit der Objekt-ID 2.2.1 hat ein eingebettetes Objekt mit der Objekt-ID 3.2.2).
RDR -> Table: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/SchemaExample ObjID=3.2.2 Err=0
Aus der Tabelle 'SchemaExample' wurde der Record vom Objekt 3.2.2 gelesen.
RE <: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eGET ObjID=2.2.1 Err=0
Die Anfrage ein Objekt mit der Objekt-ID 2.2.1 zu lesen wurde ohne Fehler abgeschlossen.

RE >: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eGETOBJIDFROMALLSET ClassID=2 Err=0
und
RE <: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eGETOBJIDFROMALLSET ClassID=2 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=5 ClientName=TestClient Schema=SchemaExample Action=eCLOSEALLSET ClassID=2 Err=0
RE <: ClientID=5 ClientName=TestClient Schema=SchemaExample Action=eCLOSEALLSET ClassID=2 Err=0
Der AllSet wurde erfolgreich geschlossen.


Ein weiteres Beispiel aus folgendem Code-Schnipsel…

t_iErr = t_pPersObject->store();

WR >: ClientID=1 ClientName=TestClient Schema=SchemaExample Action=ePROCESSTRANSACTION ObjID=2.2.1 Err=0
Es wird (WR >) für einen bestimmten Client eine Transaktion verarbeitet, in dieser wird...
WRI -> Table: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/SchemaExample ObjID=2.2.1 Err=0
...in die Tabelle 'SchemaExample' der Record vom Objekt 2.2.1 geschrieben.
WRI -> Ext.File: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/1.txt Err=0
Des weiteren wurde die externe Datei '1.txt' geschrieben (ist ein Attribut welches in dieser Datei seine Daten hat).
WRI -> Table: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/ExampleClass ObjID=2.2.1 Err=0
Der Record der Oberklasse wird auch noch geschrieben.
WR <: ClientID=1 ClientName=TestClient Schema=SchemaExample Action=ePROCESSTRANSACTION ObjID=2.2.1 Err=0
Der Teil wurde erfolgreich ohne Fehler abgeschlossen.

Jetzt das gleiche für das eingebettet Objekt (3.2.2):
WR >: ClientID=1 ClientName=TestClient Schema=SchemaExample Action=ePROCESSTRANSACTION ObjID=3.2.2 Err=0
WRI -> Table: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/SchemaExample ObjID=3.2.2 Err=0
WRI -> Table: D:/Projekte/Glo/1.0.0/msvc2015/Examples/Bases/SchemaExampleData/ExampleEmbedetClass ObjID=3.2.2 Err=0
WR <: ClientID=1 ClientName=TestClient Schema=SchemaExample Action=ePROCESSTRANSACTION ObjID=3.2.2 Err=0

'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<GloGenericPersistent> t_GenericObject;
GloGenericAllSet * t_pGenericAllSet(0);
t_pGenericAllSet = new GloGenericAllSet( * t_pBase, 2 );
t_iErr = t_pGenericAllSet->get( t_GenericObject, GloSTART );
if ( ! t_iErr )
{
do
{
t_iErr = t_pGenericAllSet->get( t_GenericObject, GloNEXT );
} while ( ! t_iErr );
t_iErr = ( t_iErr == GloERR_RANGE ? 0 : t_iErr );
}
delete t_pGenericAllSet;
Siehe auch
'2' -> shows read/write table-actions

'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.