public KTUserContext GetUpdatedContext() { if (NeedsUpdate()) { // creates new UDB, clobbers any old or unfinished updates var newUdbPath = DBPath + ".new"; if (File.Exists(newUdbPath)) { File.Delete(newUdbPath); } var newUdb = new KTUserContext(newUdbPath); IKTContext backup = GetBackupContext(); // import the rules and user data to the new db newUdb.ImportRules(Provider); if (backup != null) { var replacements = JsonConvert.DeserializeObject <Dictionary <string, Dictionary <string, string> > >(Provider.GetReplacementsJSON()); Sauvegarde.SetSerializedData(newUdb, Sauvegarde.GetSerializedData(backup), false, replacements); } // clobber the old db with the new one newUdb.Database.CloseConnection(); OldUdb?.Database?.CloseConnection(); File.Copy(newUdbPath, DBPath, true); File.Delete(newUdbPath); } return(new KTUserContext(DBPath)); }
private static void DeleteUserData(IKTContext db) { foreach (MemberTrait MembreTrait in db.MemberTraits.AsTracking()) { db.Entry(MembreTrait).State = EntityState.Deleted; } foreach (MemberPsychic MembrePsychique in db.MemberPsychics.AsTracking()) { db.Entry(MembrePsychique).State = EntityState.Deleted; } foreach (MemberWeapon MembreArme in db.MemberWeapons.AsTracking()) { db.Entry(MembreArme).State = EntityState.Deleted; } foreach (MemberPower MembrePouvoir in db.MemberPowers.AsTracking()) { db.Entry(MembrePouvoir).State = EntityState.Deleted; } foreach (MemberWarGearOption MembreRemplacement in db.MemberWarGearOptions.AsTracking()) { db.Entry(MembreRemplacement).State = EntityState.Deleted; } foreach (Member Membre in db.Members.AsTracking()) { db.Entry(Membre).State = EntityState.Deleted; } foreach (Team equipe in db.Teams.AsTracking()) { db.Entry(equipe).State = EntityState.Deleted; } db.SaveChanges(); }
public KTUserContext GetUpdatedContext() { Log("Checking if Database needs update"); if (NeedsUpdate()) { Log($"Updating Database to {Provider.GetVersion()}"); // creates new UDB, clobbers any old or unfinished updates var newUdbPath = DBPath + ".new"; if (File.Exists(newUdbPath)) { File.Delete(newUdbPath); } var newUdb = new KTUserContext(newUdbPath); IKTContext backup = GetBackupContext(); Log($"Importing rules to new database"); // import the rules and user data to the new db newUdb.ImportRules(Provider); if (backup != null) { string legacy = (backup is KTLegacyContext ? "legacy " : ""); Log($"Backing up old {legacy}Database"); var replacements = JsonConvert.DeserializeObject <Dictionary <string, Dictionary <string, string> > >(Provider.GetReplacementsJSON()); Log($"Applying {legacy}backup to new Database"); Sauvegarde.SetSerializedData( newUdb, Sauvegarde.GetSerializedData(backup), false, replacements, (float?p, string s) => Log(null, p, s) ); } Log($"Applying New Database"); // clobber the old db with the new one newUdb.Database.CloseConnection(); OldUdb?.Database?.CloseConnection(); File.Copy(newUdbPath, DBPath, true); File.Delete(newUdbPath); } Log($"Loading Database"); return(new KTUserContext(DBPath)); }
public static async Task <bool> Synchro(IKTContext db) { byte[] data = await Xamarin.Forms.DependencyService.Get <ICloud>().Synchro(Encoding.UTF8.GetBytes(GetSerializedData(db))); if (data != null && data.Length > 0) { try { var dataString = Encoding.UTF8.GetString(data); SetSerializedData(db, dataString); } catch (Exception) { Xamarin.Forms.DependencyService.Get <ICloud>().Save(Encoding.UTF8.GetBytes(GetSerializedData(db))); } return(true); } return(false); }
public static string GetSerializedData(IKTContext db) { var equipes = db.Teams .Include(e => e.Faction) .Include(e => e.Members) .ThenInclude(m => m.MemberPowers) .Include(e => e.Members) .ThenInclude(m => m.MemberWeapons) .Include(e => e.Members) .ThenInclude(m => m.MemberWarGearOptions) .Include(e => e.Members) .ThenInclude(m => m.ModelProfile) .Include(e => e.Members) .ThenInclude(m => m.Specialist) .Include(e => e.Members) .ThenInclude(m => m.MemberTraits) .Include(e => e.Members) .ThenInclude(m => m.MemberPsychics) .ToList(); return(CompressString(JsonConvert.SerializeObject(new SaveModel { DateTime = DateTime.Now, Teams = equipes }))); }
public static void SetSerializedData(IKTContext db, string data, bool deleteFirst = true, Dictionary <string, Dictionary <string, string> > replacements = default) { SaveModel saveModel = JsonConvert.DeserializeObject <SaveModel>(DecompressString(data)); if (deleteFirst) { DeleteUserData(db); } if (replacements != null && replacements.Count != 0) { saveModel = ReplaceData(saveModel, replacements); } var existing_options = db.Set <WarGearOption>() .Where(wgo => saveModel.Teams .SelectMany(t => t.Members) .SelectMany(m => m.MemberWarGearOptions) .Select(m => m.WarGearOptionId) .Contains(wgo.Id) ) .Select(wgo => wgo.Id) .ToList(); // import everything List <Team> equipes = saveModel.Teams; foreach (Team equipe in equipes) { db.Entry(equipe).State = EntityState.Added; foreach (Member membre in equipe.Members) { db.Entry(membre).State = EntityState.Added; foreach (MemberTrait MembreTrait in membre.MemberTraits) { db.Entry(MembreTrait).State = EntityState.Added; } foreach (MemberPsychic MembrePsychique in membre.MemberPsychics) { db.Entry(MembrePsychique).State = EntityState.Added; } foreach (MemberWeapon MembreArme in membre.MemberWeapons) { db.Entry(MembreArme).State = EntityState.Added; } foreach (MemberPower MembrePouvoir in membre.MemberPowers) { db.Entry(MembrePouvoir).State = EntityState.Added; } foreach (MemberWarGearOption MembreRemplacement in membre.MemberWarGearOptions) { // if the id still exists add it, otherwise skip if (existing_options.Contains(MembreRemplacement.WarGearOptionId)) { db.Entry(MembreRemplacement).State = EntityState.Added; } } } } db.SaveChanges(); }
public static void SetSerializedData( IKTContext db, string data, bool deleteFirst = true, Dictionary <string, Dictionary <string, string> > replacements = default, Action <float?, string> callback = null ) { callback?.Invoke(0, "Reading backup"); SaveModel saveModel = JsonConvert.DeserializeObject <SaveModel>(DecompressString(data)); int size = saveModel.Size; if (deleteFirst) { DeleteUserData(db); } callback?.Invoke(0, "Cleaning up old data"); if (replacements != null && replacements.Count != 0) { saveModel = ReplaceData(saveModel, replacements); } var existing_options = db.Set <WarGearOption>() .Where(wgo => saveModel.Teams .SelectMany(t => t.Members) .SelectMany(m => m.MemberWarGearOptions) .Select(m => m.WarGearOptionId) .Contains(wgo.Id) ) .Select(wgo => wgo.Id) .ToList(); // import everything int progress = 0; List <Team> equipes = saveModel.Teams; foreach (Team equipe in equipes) { db.Entry(equipe).State = EntityState.Added; foreach (Member membre in equipe.Members) { float percent = (float)progress / size; callback?.Invoke(percent, $"Adding {membre.Name} from {equipe.Name}"); progress += 1; db.Entry(membre).State = EntityState.Added; foreach (MemberTrait MembreTrait in membre.MemberTraits) { db.Entry(MembreTrait).State = EntityState.Added; } foreach (MemberPsychic MembrePsychique in membre.MemberPsychics) { db.Entry(MembrePsychique).State = EntityState.Added; } foreach (MemberWeapon MembreArme in membre.MemberWeapons) { db.Entry(MembreArme).State = EntityState.Added; } foreach (MemberPower MembrePouvoir in membre.MemberPowers) { db.Entry(MembrePouvoir).State = EntityState.Added; } foreach (MemberWarGearOption MembreRemplacement in membre.MemberWarGearOptions) { // if the id still exists add it, otherwise skip if (existing_options.Contains(MembreRemplacement.WarGearOptionId)) { db.Entry(MembreRemplacement).State = EntityState.Added; } } } } db.SaveChanges(); }