| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153 |
- /*-------------------------------------------------------------------------
- * 功能描述: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);
- }
- }
- }
- }
|