예제 #1
0
        private static void UpgradeToLatestStructureVersion(this IVault vault)
        {
            var pos = History.FindIndex(p => p.First == vault.GetStructureVersionToken());

            if (pos == -1)
            {
                throw new ArgumentException(String.Format("Version '{0}' is not supported", vault.GetStructureVersionToken()));
            }
            if (pos == History.Count - 1)
            {
                return;
            }

            var origFilename           = vault.Uri;
            Func <int, String> namegen = i => origFilename + "." + vault.GetStructureVersionToken() + ".bak" + (i == 1 ? null : i.ToString());
            var lastUsedIndex          = 1.Seq(i => i + 1, i => File.Exists(namegen(i))).LastOrDefault();
            var bakFilename            = namegen(lastUsedIndex + 1);

            vault.SaveAs(bakFilename);
            History.Skip(pos + 1).ForEach(p => { p.Second(vault); vault.UpdateStructureVersionToken(p.First); });
            (History.Last().First == Current).AssertTrue();
            vault.UpdateStructureVersionToken(Current);
            vault.SaveAs(origFilename);
        }
예제 #2
0
 public override IVault SaveAs(string uri)
 {
     Materialize();
     _vault.SaveAs(uri);
     return(this);
 }