|
@@ -0,0 +1,153 @@
|
|
|
+/*-------------------------------------------------------------------------
|
|
|
+ * 功能描述:VersionManager
|
|
|
+ * 作者:xulisong
|
|
|
+ * 创建时间: 2019/4/12 10:52:51
|
|
|
+ * 版本号:v1.0
|
|
|
+ * -------------------------------------------------------------------------*/
|
|
|
+
|
|
|
+using System;
|
|
|
+using System.Collections.Generic;
|
|
|
+using System.IO;
|
|
|
+using System.Linq;
|
|
|
+using System.Reflection;
|
|
|
+using System.Text;
|
|
|
+using System.Threading.Tasks;
|
|
|
+using System.Xml;
|
|
|
+using System.Xml.Serialization;
|
|
|
+using Saga.Framework.DB.Sqlite;
|
|
|
+
|
|
|
+namespace SAGA.DotNetUtils.Data.Framework.Sqlite
|
|
|
+{
|
|
|
+ public class VersionManager
|
|
|
+ {
|
|
|
+ private static VersionManager m_Default;
|
|
|
+ public static VersionManager Default
|
|
|
+ {
|
|
|
+ get
|
|
|
+ {
|
|
|
+ if (m_Default == null)
|
|
|
+ {
|
|
|
+ m_Default = m_InitManager?.Invoke();
|
|
|
+ }
|
|
|
+ if (m_Default == null)
|
|
|
+ {
|
|
|
+ string defaultPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SqliteVersion.xml");
|
|
|
+ m_Default = new VersionManager(defaultPath);
|
|
|
+ }
|
|
|
+ return m_Default;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private static Func<VersionManager> m_InitManager;
|
|
|
+ public static void Init(Func<VersionManager> initManager)
|
|
|
+ {
|
|
|
+ m_Default = null;
|
|
|
+ m_InitManager = initManager;
|
|
|
+ }
|
|
|
+ #region 加载保存版本信息
|
|
|
+ private static XmlSerializer CreateSerializer<T>()
|
|
|
+ {
|
|
|
+ Type type = typeof(T);
|
|
|
+ string useRootName = null;
|
|
|
+ if (type.IsGenericType)
|
|
|
+ {
|
|
|
+ var attribute = type.GetGenericArguments()[0].GetCustomAttribute(typeof(XmlRootAttribute)) as XmlRootAttribute;
|
|
|
+ if (attribute != null)
|
|
|
+ {
|
|
|
+ useRootName = attribute.ElementName + "s";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ XmlSerializer xs = null;
|
|
|
+ if (string.IsNullOrEmpty(useRootName))
|
|
|
+ {
|
|
|
+ xs = new XmlSerializer(type);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ xs = new XmlSerializer(type, new XmlRootAttribute(useRootName));
|
|
|
+ }
|
|
|
+
|
|
|
+ return xs;
|
|
|
+ }
|
|
|
+ public static void SaveVersions(List<VersionItem> versions, string path)
|
|
|
+ {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ using (TextWriter writer = new StringWriter(sb))
|
|
|
+ {
|
|
|
+ XmlTextWriter xtw = new XmlTextWriter(writer);
|
|
|
+ xtw.Formatting = Formatting.Indented;
|
|
|
+ var serializer = CreateSerializer<List<VersionItem>>();
|
|
|
+ serializer.Serialize(xtw, versions);
|
|
|
+ if (!File.Exists(path))
|
|
|
+ {
|
|
|
+ var directory = Path.GetDirectoryName(path);
|
|
|
+ if (!Directory.Exists(directory))
|
|
|
+ {
|
|
|
+ Directory.CreateDirectory(directory);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ File.WriteAllText(path, sb.ToString());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public static List<VersionItem> GetVersions(string path)
|
|
|
+ {
|
|
|
+ List<VersionItem> items = new List<VersionItem>();
|
|
|
+ if (!File.Exists(path))
|
|
|
+ {
|
|
|
+ return items;
|
|
|
+ }
|
|
|
+ using (TextReader tr = new StreamReader(path))
|
|
|
+ {
|
|
|
+ XmlTextReader xtr = new XmlTextReader(tr);
|
|
|
+
|
|
|
+ var serializer = CreateSerializer<List<VersionItem>>();
|
|
|
+ items = serializer.Deserialize(xtr) as List<VersionItem>;
|
|
|
+ }
|
|
|
+ return items??new List<VersionItem>();
|
|
|
+ }
|
|
|
+ #endregion
|
|
|
+ public VersionManager(List<VersionItem> versions)
|
|
|
+ {
|
|
|
+ //可以在配置文件加载
|
|
|
+ //需要整理版本顺序,和语句执行顺序
|
|
|
+ VersionItems = versions;
|
|
|
+ }
|
|
|
+
|
|
|
+ public VersionManager(string configPath)
|
|
|
+ {
|
|
|
+ VersionItems = GetVersions(configPath);
|
|
|
+ }
|
|
|
+ public List<VersionItem> VersionItems { get; private set; }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 更新给定库,到版本集合中的最高版本
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="database"></param>
|
|
|
+ public void UpdateDatabaseVersion(SqliteDatabase database)
|
|
|
+ {
|
|
|
+ var oldNum = database.GetUserVersionNum();
|
|
|
+ var orderVersionItems=VersionItems.OrderBy(v => v.Num).ToList();
|
|
|
+ foreach (var orderVersionItem in orderVersionItems)
|
|
|
+ {
|
|
|
+ if (orderVersionItem.Num <= oldNum)
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ var orderStatements =
|
|
|
+ (orderVersionItem.Statements ?? new List<ExecutionStatement>()).OrderBy(s => s.Index);
|
|
|
+ foreach (var executionStatement in orderStatements)
|
|
|
+ {
|
|
|
+ if (string.IsNullOrWhiteSpace(executionStatement.SqlText))
|
|
|
+ {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ database.ExecuteNonQuery(executionStatement.SqlText);
|
|
|
+ }
|
|
|
+
|
|
|
+ database.SetUserVersionNum(orderVersionItem.Num);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|