GlobalObjects
GlobalObjects (© 1995-2020 Helmut Jakoby)

Einleitung

GlobalObjects ist ein System um C++ Objekte einfach speichern und laden zu können. Es ist Single- und Multiuserbetrieb (über einen Server) möglich.

Wer die Objektdatenbank FastObjects kennt (ursprünglich entwickelt von Poet), wird viele Konzepte dieses Systems bei GlobalObjects wiederfinden.

Mittels GlobalObjects können auch komplexe Objekte einfachst gespeichert, geladen und auch wieder gelöscht werden. Dieses kann auch in Transaktionen stattfinden, welche bestätigt (Aktionen werden ausgeführt) oder abgebrochen (Aktionen werden nicht ausgeführt) werden können. Es existiert ein umfangreicher Sperrmechanismus um gespeicherte Objekte zu schützen. Um Änderungen am Objektbestand "mitzubekommen", kann ein einfaches Benachrichtigungssystem genutzt werden.

Das Hauptaugenmerk liegt im einfachen Abspeichern und Laden von auch komplexen C++ Objekten mit deren Referenzen und der Aktualisierung von geladenen Objekten im Speicher, wenn diese von anderer Seite geändert werden.

GlobalObjects wurde bislang mit Microsoft Visual C++ 2010 (32 Bit), Microsoft Visual C++ 2015 (32 und 64 Bit), Microsoft Visual C++ 2017 (32 und 64 Bit), Microsoft Visual C++ 2019 (32 und 64 Bit), MinGW Version 5.3.0 (32 Bit), MinGW Version 7.3.0 (32 und 64 Bit) unter MS-Windows und gcc 4.8.3 (32 Bit), gcc 5.4.0 (32 Bit), gcc 7.4.40 (64 Bit) und clang 6.0.0 (64 Bit) unter LINUX kompiliert und getestet. Man kann z.B. einen GloServer auf irgendein unterstütztes Betriebssystem installieren und auf diesen von allen unterstützten Betriebssystemen zugreifen.


Alternativen um C++ Objekte zu speichern

Um C++ Objekte aus dem Speicher des Rechners persistent ablegen zu können, gibt es grob gesagt drei Möglichkeiten:

  • Serialisieren auf einem Datenträger wie z.B. einer Festplatte oder SSD.
  • Konvertieren in ein relationales Modell und dieses in einer konventionellen relationalen Datenbank abzulegen.
  • Direkt abspeichern in eine Objekt-Datenbank.

Konzept von GlobalObjects

GlobalObjects geht den Weg, das die C++ Objekte wie in einer Objekt-Datenbank gespeichert werden; die Ablage aber im Dateisystem eines Datenträgers vorgenommen wird. In einer späteren Ausbaustufe ist angedacht, die Ablage in einer SQL-Datenbank wie z.B. SQLite vorzunehmen.

Ein Datenbankdesign muss bei GlobalObjects nicht vorgenommen werden.

Leistungsmerkmale

Hier ein kurzer Abriss der Möglichkeiten von GlobalObjects:

Speichern, laden und löschen

Mit GlobalObjects ist ein direktes speichern, laden und löschen von C++ Objekten in einer Objektdatenbank möglich. Es wird die einfache wie auch Mehrfachvererbung von C++ unterstützt. Es steht für jede Klasse ein AllSet (die Menge aller gespeicherten Objekte der Klasse) zur Verfügung. Beim Laden eines Objektes aus einem AllSet wird das echte Objekt instanziiert, welches ggf. abgeleitet sein kann (das Laden eines Objektes aus dem AllSet der "Tiere" instanziiert die jeweiligen Objekte z.B. vom Typ "Fisch" und "Vogel" etc.).
Es kann eingestellt werden, ob referenzierte Objekte mitgeladen, mitgespeichert oder mit gelöscht werden sollen.

Beispiel:

...
#include <GloBase.h>
// Die persistenten Klassen werden vom Objekt-Ersteller eingebunden!
#include "FirstBaseObjCreator.h"
...
MyFirstBaseObjCreator t_ObjCreator;
GloBase t_Base( "LOCAL", "ClientName", "FirstBase", t_ObjCreator ); // ohne Server
// GloBase t_Base( "HOSTNAME", "ClientName", "FirstBase", t_ObjCreator ); // mit Server (HOSTNAME)
...
if ( t_Base.openBase() == 0 )
{
int t_iErr = 0;
// neues Objekt vom Typ FirstPersClass; GloForgeter<FirstPersClass>()wird mit übergeben
std::shared_ptr<FirstPersClass> t_NewPersObject( new FirstPersClass(), GloForgeter<FirstPersClass>() );
// Bei der Base anmelden, das Objekt bekommt somit eine gültige Objekt-ID (siehe GloObjID).
if ( t_NewPersObject->assign( t_Base ) == 0 )
{
// einfach speichern, wenn kein Fehler ist das komplette Objekt in dar Datenbank
t_iErr = t_NewPersObject->store();
}
...
// 1. Objekt aus dem AllSet holen
std::shared_ptr<FirstPersClass> t_PersObject;
GloTAllSet<MyFirstClass> t_AllSet( t_Base );
t_AllSet.get( t_PersObject, GloSTART ); // holt erstes Objekt aus dem AllSet in t_PersObject
// mach irgendwas mit t_PersObject...
...
// ... und speicher dieses wieder
t_iErr = t_PersObject->store();
...
// ... bzw. lösch dieses
t_iErr = t_PersObject->deleteInBase();
...
t_Base.closeBase()
}

Referenzen

Es werden Referenzen wie Pointer, auch in Containern, auf andere Objekte in der Objektdatenbank zur Reverenznavigation angeboten. Es kann eingestellt werden, ob die referenzierten Objekte mit dem Objekt mitgeladen (instanziiert) werden oder erst beim Zugriff auf diese (siehe auch GloTOndemand, GloTOndemandList und GloTOndemandSet ). Zudem kann eine Abhängigkeit eingestellt werden (dependent) so dass referenzierte Objekte z.B. mitgespeichert bzw. mitgelöscht werden. Mehr...

Sperrverfahren

Um Multiuserzugriffe zu gewährleisten, ist ein Sperrmechanismus bis auf Objektebene implementiert (Eine Menge von Objekten bis zum einzelne Objekte können unterschiedlich gesperrt werden). Mehr...

Transaktionen

Um mehrere Objektdatenbank-Aktionen geschlossen vornehmen zu können, werden Transaktionen zur Verfügung gestellt. Es werden geschachtelte Transaktionen unterstützt. Mehr...

Beobachten und benachrichtigen

Damit Änderungen an Objekten in der Objektdatenbank von einer Applikation wahrgenommen werden können, um z.B. die Objekte im Speicher konsistent zu halten, ist ein einfachst zu nutzendes Benachrichtigungssystem vorhanden. Mehr...

Indexe

Um Objekte anhand von Attributwerten zu finden, ist es möglich Objekte über ihre Attribute zu indizieren Es ist möglich, Objekte über eigene Attribute, Attribute von Oberklassen und Attribute von referenzierten bzw. eingebetteten Klassen zu indizieren. Es können Attribute zusammengefasst werden wie z.B. "Name" und "Vorname" als ein Index-Attribut. Mehr...

Unterstützte Datentypen

Es werden die meisten Standardtypen als eingebettet unterstützt. Aktuell werden diese Datentypen für persistente Objekte unterstützt.

Lizenz

GlobalObjects ist freie Software:

GNU Lesser General Public License Nutzung
Sie können das Programm unter den Bedingungen der GNU Lesser General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
Details finden Sie in der GNU General Public License: https://www.gnu.org/licenses/lgpl-3.0.html.

GNU General Public License Nutzung
Alternativ können sie das Programm auch unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder (nach Ihrer Option) jeder späteren Version.
Details finden Sie in der GNU General Public License: https://www.gnu.org/licenses/gpl-3.0.html.

Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.

GloTAllSet
AllSet, welcher Objekte aus der Datenbank liefert. Im AllSets sind alle Instanzen eines Objekttyps in...
Definition: GloTAllSet.h:132
GloBase
Diese Klasse ist die Schnittstelle für den Client zu den persistenten Objekten. Hier können "Objekte"...
Definition: GloBase.h:136
GloForgeter
Speziel für GloGenericPersistent oder abgeleitete Klassen von GloPersistent die Forget-Methode für st...
Definition: GloTypes.h:985
GloSTART
@ GloSTART
Definition: GloTypes.h:189