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);