![]() |
e:mendata Okta Core
|
Datenaustausch Lokale Daten - Server Daten Im Schritt1 werden nur HashWerte/Stamp verglichen. Da im neuen System wirlich nur Änderungen weggespeichert werden wird das Speicherdatum = changed verwendet. Dieser Zeitstamp ist immer UTC. ;-)
public class SyncTrans {
/// <summary>
/// Data Hash for Sync
/// </summary>
public string Hash { get; set; } = "";
/// <summary>
/// ID Filename => DataID
/// </summary>
public string ID { get; set; } = "";
/// <summary>
/// Base64 emdj File ReadAll
/// </summary>
public string Blob { get; set; } = "";
/// <summary>
/// Helper If copy This Data to Lokal (1)
/// (0) no copy
/// </summary>
public int Copy { get; set; } = 0;
/// <summary>
/// TimeStamp last Wrote
/// </summary>
public DateTime? Stamp { get; set; }
}
public async Task<string?> SyncWorkflow(bool force) {
WebApiWorker wc = new WebApiWorker(WebApi);
_LokalProcess.Invoke("start", new SyncEventArgs("Start"));
// 1) get all Lokal Data 2 HashList
IEnumerable<SyncTrans> LokalHashData = IOAccess.GetLokalDataPool();
_LokalProcess.Invoke("lokal Data", new SyncEventArgs(LokalHashData.Count()));
// 2) Push Hash List 2 Server
// 3) Get Difference List from Server
IEnumerable<SyncTrans>? ServerHashDataList = await wc.PushLokalHashData(LokalHashData,Lizenz);
_LokalProcess.Invoke("Server Data", new SyncEventArgs(ServerHashDataList.Count()));
// 4) Get Server Newer Data
IEnumerable<SyncTrans>? SyncResultSet = IOAccess.PushServerDataToLokal(ServerHashDataList, Lizenz);
_LokalProcess.Invoke("Lokale Daten", new SyncEventArgs(ServerHashDataList.Count()));
// 5) Server 2 Lokal && Lokal Newer as Pool 2 Server
var ServerUpdateList = IOAccess.GetLokalDataPoolSet(SyncResultSet);
_LokalProcess.Invoke("Server Data", new SyncEventArgs("Done"));
// 6) Done....
await Task.Delay(10);
return null;
}
public IEnumerable<SyncTrans> GetLokalDataPool() {
if (new DirectoryInfo(IODataPath) is DirectoryInfo di && di.Exists) {
var Res = new List<SyncTrans>();
if (di.GetFiles("*.emdj", new EnumerationOptions { RecurseSubdirectories = true }) is IEnumerable<FileInfo> files) {
foreach (var file in files) {
SyncTrans trans = new SyncTrans();
trans.ID = Path.GetFileNameWithoutExtension(file.Name);
trans.Hash = file.FullName?.GetMD5Hash() ?? string.Empty;
trans.Copy = 0;
trans.Stamp = file.LastWriteTimeUtc;
Res.Add(trans);
}
return Res;
}
}
return Array.Empty<SyncTrans>();
}
Der Server prüft die "lokalen" SyncTrans mit den Server Daten.
Gib Liste zurück.
Client verarbeitet gefüllte SyncTransListe
sendet diese als letzten Schritt zum Server, dort werden diese auf den Server kopiert. nur copy =-1 und Blob => LizenzKey Pool Ablage
Info als Feedback => Client Result
Damit sollte der Vorgang abgeschlossen sein.