OBS/App/dev docs

Aus OBS Wiki
Zur Navigation springen Zur Suche springen

<accesscontrol>Programmierer</accesscontrol>


Admin-Hilfe

OBS-Administration / Installation
OBS Umzug
Allgemein
kundenspezifische Anpassungen
OBS Protokolle


App Entwickler-Dokumentation

globale UID

Anforderung

Die UID (sys_uid) muss pro Gerät eindeutig sein damit ein Datensatz eindeutig identifiziert werden kann. Dazu wird die Uid in der Tabelle uniquenr gespeichert. Auf App-Seite erstellte UID's beginnen alle mit "A" damit es keine Überscheidungen mit OBS-UID's gibt.

Problem

Durch die Synchronisation wird die Datenbank für Mobilgeräte regelmäßig (Standard 30 Tage) neu erstellt. Dadurch wird auch die Tabelle uniquenr überschrieben und ein neuer Datensatz kann dieselbe UID bekommen wie ein bereits existierender Datensatz.

Lösung

Dafür haben wir eine doppelte Sicherheitsmechanik:

1. Bei der Erzeugung einer neuen UID in der App wird die UID zusätzlich in die lokale Konfigurationsdatei (INI) geschrieben. Beim Start der App wird die INI ausgelesen und falls der Wert größer ist als der Eintrag in uniquenr wird er ersetzt.

2. Da in bestimmten Fällen auch die INI gelöscht werden kann (Neuinstallation, Datenspeicher löschen, etc.) brauchen wir auch dafür eine Sicherheit da falsche UID's das gesamte System kompromitieren würden. Bei jeder Datenübertragung (App zu OBS) wird in das Changelog zusätzlich der aktuelle Wert aus uniquenr geschrieben. Bei der Synchronisation der Daten wird der Wert in die Tabelle app_uidmatch mit dem Typ "glb" übernommen. (Die Tabelle app_uidmatch gehört zum statischen Block der Synchronisation (TODO link zur erklärung)). Beim Start der App wird zusätzlich zur INI also auch der Wert aus app_uidmatch geprüft. Ist dieser Wert größer als DB und INI (sprich beides wurde gelöscht) wird der Wert aus app_uidmatch nach uniquenr übernommen plus einen Sicherheitsinterval (erstmal 5000). Der Sicherheitsinterval ist nötig da übertragene Daten evtl. noch nicht synchronisiert wurden und damit der Wert in app_uidmatch noch nicht auf dem neuesten Stand ist.

betroffene Methoden

Base.App -> TxAppLib.RegisterId(const nId: Int64);
Base.App -> TAppUidMatch.SetGlobalUid(oMyDb: TxDB): Boolean;
Obs.Initialize -> TxApp._SetGlobalUid();
Obs.System -> TxSystem.RegisterUid(const nId: Int64);

Eindeutigkeit von UID's

Anforderung

UID's müssen auch geräteübergreifend eindeutig bleiben um keine Überschneidungen zu bekommen.

Lösung

Um das Problem zu lösen ist eine Reihe von Schritten nötig:

Nummernvergabe

Damit UID's die auf einem Mobilgerät erzeugt werden sich niemals mit UID's aus OBS überschneiden wird dort bei jeder UID ein "A" vorangestellt. Untereinander ist eine Überschneidung kein Problem da keine direkte Kommunikation zwischen Mobilgeräten besteht.

Übernahme der UID in OBS

Wird ein auf einem Mobilgeräte erzeugter Datensatz in OBS übernommen wird auch die "echte" UID vergeben. Dabei dir die neue UID zusammen mit der Alten in der Tabelle "app_uidmatch" gespeichert (Typ MATCH_SYS). Danach wird das aktuelle Changelog nach der alten UID durchsucht um sie mit der aktuellen UID zu ersetzen.

Base.App -> TAppUidMatch.GetNewUid(..)
Base.App -> TAppChangelog.ReplaceAppSysUid(..)

Übertragung von neu angelegten UID's an die App

Damit auf dem Mobilgerät der Eintrag mit der temporär vergebenen UID auch alle zukünftigen Änderungen synchronisieren kann, muss dort die UID durch die neu vergebene "echte" UID ersetzt werden. Dazu wird die Tabelle "app_uidmatch" im STATIC-Teil der Synchronisation mit übergeben (wird immer zu 100% übertragen und vor der eigentlichen Synchronisation verarbeitet). Alle Einträge vom Typ "MATCH_SYS" die zum aktiven Gerät passen werden gesucht und die UID wird ersetzt. Danach wird ein Löscheintrag ins Changelog geschrieben.

Base.App -> TAppUidMatch.AdoptHostUid(..)
applib.Synchronization -> TAppDataSync.UidMatchSuccess(..)

Löschen von verarbeiteten UID-Änderungen

Am Ende eines Synchronisations-Vorgangs in OBS läuft eine Methode die sämtliche temporär vergebenen UID's durch "echte" UID's ersetzt falls diese existieren.

Base.App -> TAppChangelog.ReplaceAppUid(..)

Alle Löscheinträge zu UID's führen dazu dass die entsprechende UID aus der Tabelle "app_uidmatch" entfernt wird. Der Löscheintrag selbst wird auch entfernt.

Base.App -> TAppChangelog.CloseUidMatches(..)

Schlüssel-Nummern vergeben

Problem

Nummer, die als Schlüssel in anderen Tabellen verwendet werden (z.B. Personennummer, Artikelnummer, Auftragsnummer, ...) können auf einem Mobilgerät nicht vergeben werden da keine Eindeutigkeit garantiert werden kann.

Lösung

Es werden nur temporäre Nummern vergeben, die erst bei der Übernahme in OBS zu echten Nummern getauscht werden.

Base.App -> TAppUidMatch.GetNewMockId(..)

Dabei orientiert sich der Ablauf an der Vergabe von eindeutigen UID's, nur der Typ weicht ab (MATCH_ID).

Es gibt auch eine abweichende Methode zur Änderung von Nummern innerhalb des Changelogs.

Base.App -> TAppChangelog.ReplaceMockId(..)