VersionManager.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. /*-------------------------------------------------------------------------
  2. * 功能描述:VersionManager
  3. * 作者:xulisong
  4. * 创建时间: 2019/4/12 10:52:51
  5. * 版本号:v1.0
  6. * -------------------------------------------------------------------------*/
  7. using System;
  8. using System.Collections.Generic;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Reflection;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Xml;
  15. using System.Xml.Serialization;
  16. using Saga.Framework.DB.Sqlite;
  17. namespace SAGA.DotNetUtils.Data.Framework.Sqlite
  18. {
  19. public class VersionManager
  20. {
  21. private static VersionManager m_Default;
  22. public static VersionManager Default
  23. {
  24. get
  25. {
  26. if (m_Default == null)
  27. {
  28. m_Default = m_InitManager?.Invoke();
  29. }
  30. if (m_Default == null)
  31. {
  32. string defaultPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "SqliteVersion.xml");
  33. m_Default = new VersionManager(defaultPath);
  34. }
  35. return m_Default;
  36. }
  37. }
  38. private static Func<VersionManager> m_InitManager;
  39. public static void Init(Func<VersionManager> initManager)
  40. {
  41. m_Default = null;
  42. m_InitManager = initManager;
  43. }
  44. #region 加载保存版本信息
  45. private static XmlSerializer CreateSerializer<T>()
  46. {
  47. Type type = typeof(T);
  48. string useRootName = null;
  49. if (type.IsGenericType)
  50. {
  51. var attribute = type.GetGenericArguments()[0].GetCustomAttribute(typeof(XmlRootAttribute)) as XmlRootAttribute;
  52. if (attribute != null)
  53. {
  54. useRootName = attribute.ElementName + "s";
  55. }
  56. }
  57. XmlSerializer xs = null;
  58. if (string.IsNullOrEmpty(useRootName))
  59. {
  60. xs = new XmlSerializer(type);
  61. }
  62. else
  63. {
  64. xs = new XmlSerializer(type, new XmlRootAttribute(useRootName));
  65. }
  66. return xs;
  67. }
  68. public static void SaveVersions(List<VersionItem> versions, string path)
  69. {
  70. StringBuilder sb = new StringBuilder();
  71. using (TextWriter writer = new StringWriter(sb))
  72. {
  73. XmlTextWriter xtw = new XmlTextWriter(writer);
  74. xtw.Formatting = Formatting.Indented;
  75. var serializer = CreateSerializer<List<VersionItem>>();
  76. serializer.Serialize(xtw, versions);
  77. if (!File.Exists(path))
  78. {
  79. var directory = Path.GetDirectoryName(path);
  80. if (!Directory.Exists(directory))
  81. {
  82. Directory.CreateDirectory(directory);
  83. }
  84. }
  85. File.WriteAllText(path, sb.ToString());
  86. }
  87. }
  88. public static List<VersionItem> GetVersions(string path)
  89. {
  90. List<VersionItem> items = new List<VersionItem>();
  91. if (!File.Exists(path))
  92. {
  93. return items;
  94. }
  95. using (TextReader tr = new StreamReader(path))
  96. {
  97. XmlTextReader xtr = new XmlTextReader(tr);
  98. var serializer = CreateSerializer<List<VersionItem>>();
  99. items = serializer.Deserialize(xtr) as List<VersionItem>;
  100. }
  101. return items??new List<VersionItem>();
  102. }
  103. #endregion
  104. public VersionManager(List<VersionItem> versions)
  105. {
  106. //可以在配置文件加载
  107. //需要整理版本顺序,和语句执行顺序
  108. VersionItems = versions;
  109. }
  110. public VersionManager(string configPath)
  111. {
  112. VersionItems = GetVersions(configPath);
  113. }
  114. public List<VersionItem> VersionItems { get; private set; }
  115. /// <summary>
  116. /// 更新给定库,到版本集合中的最高版本
  117. /// </summary>
  118. /// <param name="database"></param>
  119. public void UpdateDatabaseVersion(SqliteDatabase database)
  120. {
  121. var oldNum = database.GetUserVersionNum();
  122. var orderVersionItems=VersionItems.OrderBy(v => v.Num).ToList();
  123. foreach (var orderVersionItem in orderVersionItems)
  124. {
  125. if (orderVersionItem.Num <= oldNum)
  126. {
  127. continue;
  128. }
  129. var orderStatements =
  130. (orderVersionItem.Statements ?? new List<ExecutionStatement>()).OrderBy(s => s.Index);
  131. foreach (var executionStatement in orderStatements)
  132. {
  133. if (string.IsNullOrWhiteSpace(executionStatement.SqlText))
  134. {
  135. continue;
  136. }
  137. database.ExecuteNonQuery(executionStatement.SqlText);
  138. }
  139. database.SetUserVersionNum(orderVersionItem.Num);
  140. }
  141. }
  142. }
  143. }