lith 4 years ago
parent
commit
9a98e0cefa

+ 32 - 92
Library/Vit.Db.DbMng/BaseDbMng.cs

@@ -7,6 +7,7 @@ using System.Data;
 using System.IO;
 using System.Text.RegularExpressions;
 using Vit.Core.Module.Log;
+using Vit.Db.DbMng.SqlerFile;
 using Vit.Extensions;
 using Vit.Orm.Dapper;
 using Vit.Orm.Dapper.Data.Sqlite;
@@ -101,7 +102,7 @@ namespace Vit.Db.DbMng
                 Log(" --(x.1)创建建库语句文件(CreateDataBase.sql)");
                 var sqlPath = Path.Combine(tempPath, "CreateDataBase.sql");
                 var sqlText = BuildCreateDataBaseSql();
-                File.WriteAllText(sqlPath, sqlText, System.Text.Encoding.GetEncoding("utf-8"));
+                File.WriteAllText(sqlPath, sqlText, System.Text.Encoding.UTF8);
 
                 Log("     成功");
                 span = (DateTime.Now - lastTime);
@@ -156,8 +157,7 @@ namespace Vit.Db.DbMng
                 lastTime = DateTime.Now;
 
                 #endregion
-
-
+                               
 
 
                 #region (x.3)压缩备份文件
@@ -191,7 +191,7 @@ namespace Vit.Db.DbMng
                 
 
                 Log("");
-                Log("   backup success,sum table count: "+ sumTableCount + ",sum row count: " + sumRowCount);
+                Log("   backup success, table count: "+ sumTableCount + ",  row count: " + sumRowCount);
                 span = (DateTime.Now - startTime);
                 Log($"   总共耗时:{span.Hours}小时{span.Minutes}分{span.Seconds}秒{span.Milliseconds}毫秒");
                 Log("");
@@ -221,10 +221,8 @@ namespace Vit.Db.DbMng
         /// <returns>备份文件的路径</returns>
         public virtual string RestoreSqler(string filePath)
         {
-
             var tempPath = filePath + "_Temp";
 
-
             try
             {
                 var startTime = DateTime.Now;
@@ -281,103 +279,45 @@ namespace Vit.Db.DbMng
                 #endregion
 
 
-
-                #region (x.4)执行建库语句文件(CreateDataBase.sql)
+                #region (x.4)获取备份文件信息
                 Log("");
-                Log(" --(x.4)执行建库语句文件(CreateDataBase.sql)");
+                Log(" --(x.4)获取备份文件信息");
+                SqlerBackuper backuper = new SqlerBackuper();
+                backuper.dirPath = tempPath;
+                backuper.conn = conn;
+                backuper.Log = Log;
 
-                var sqlPath = Path.Combine(tempPath, "CreateDataBase.sql");
-                var sqlText = File.ReadAllText(sqlPath, System.Text.Encoding.GetEncoding("utf-8"));
+                backuper.sqlSplit = RestoreSqler_SqlSplit;
 
-                Action runSql = () =>
-                {
-                    using (var tran = conn.BeginTransaction())
-                    {
-                        try
-                        {
-                            Regex reg = RestoreSqler_SqlSplit;
-                            if (reg == null)
-                            {
-                                conn.Execute(sqlText, transaction: tran);
-                            }
-                            else
-                            {
-                                var sqls = reg.Split(sqlText);
-                                foreach (String sql in sqls)
-                                {
-                                    if (!String.IsNullOrEmpty(sql.Trim()))                                   
-                                    {
-                                        conn.Execute(sql, transaction: tran);                                
-                                    }
-                                }
-                            }
-                            tran.Commit();
-                        }
-                        catch (Exception ex)
-                        {
-                            Logger.Error(ex);
-                            tran.Rollback();
-                            throw;
-                        }
-                    }
-                };
-
-
-                //确保conn打开
-                conn.MakeSureOpen(runSql);
-
-                Log("     成功");
-                span = (DateTime.Now - lastTime);
-                Log($"     当前耗时:{span.Hours}小时{span.Minutes}分{span.Seconds}秒{span.Milliseconds}毫秒");
-                span = (DateTime.Now - startTime);
-                Log($"     总共耗时:{span.Hours}小时{span.Minutes}分{span.Seconds}秒{span.Milliseconds}毫秒");
-                lastTime = DateTime.Now;
+                backuper.ReadBackupInfo();
                 #endregion
 
 
-                #region (x.5)导入所有表数据(Data.sqlite3)
+                #region (x.5)执行命令
                 Log("");
-                Log(" --(x.5)导入所有表数据(Data.sqlite3)");
-
-                int sumRowCount = 0;
-                int sumTableCount;
-
-                string sqlitePath = Path.Combine(tempPath, "Data.sqlite3");
-                using (var connSqlite = ConnectionFactory.Sqlite_GetOpenConnectionByFilePath(sqlitePath, Version: 3)) 
-                {                 
-                    var tableNames = connSqlite.Sqlite_GetAllTableName();
-                    sumTableCount = tableNames.Count;
-                    int tbIndex = 0;
-            
-                    foreach (var tableName in tableNames)
-                    {
-                        tbIndex++;
-
-                        Log("");
-                        Log($" ----[{tbIndex}/{sumTableCount}]import table " + tableName);
-
-                        int rowCount;
-                        using (var dr = connSqlite.ExecuteReader($"select * from {connSqlite.Quote(tableName)}"))
-                        {                             
-                            rowCount = conn.BulkImport(dr, tableName);
-                            sumRowCount += rowCount;                         
-                        }
-
-                        Log($"     table imported. cur: " + rowCount + "  sum: " + sumRowCount);
-                    }       
+                Log(" --(x.5)执行命令");
+                int t = 0;
+                foreach (var cmd in backuper.backupInfo.cmd) 
+                {
+                    t++;
+
+                    Log("");
+                    Log(" ----(x.x." + t + ")执行命令");
+                    Log("    " + cmd.Serialize());
+                    backuper.ExecCmd(cmd);
+
+              
+                    span = (DateTime.Now - lastTime);
+                    Log($"     当前耗时:{span.Hours}小时{span.Minutes}分{span.Seconds}秒{span.Milliseconds}毫秒");
+                    span = (DateTime.Now - startTime);
+                    Log($"     总共耗时:{span.Hours}小时{span.Minutes}分{span.Seconds}秒{span.Milliseconds}毫秒");
+                    lastTime = DateTime.Now;
                 }
-
-                Log("");
-                Log("     成功,sum table count: " + sumTableCount + ",sum row count: " + sumRowCount);
-                span = (DateTime.Now - lastTime);
-                Log($"     当前耗时:{span.Hours}小时{span.Minutes}分{span.Seconds}秒{span.Milliseconds}毫秒");
-                span = (DateTime.Now - startTime);
-                Log($"     总共耗时:{span.Hours}小时{span.Minutes}分{span.Seconds}秒{span.Milliseconds}毫秒");
-                lastTime = DateTime.Now;
                 #endregion
+            
 
                 Log(""); 
-                Log("   restore success,sum table count: " + sumTableCount + ",sum row count: " + sumRowCount);
+                Log("   restore success, table count: " + backuper.importedTableCount + ",row count: " + backuper.importedRowCount);
                 span = (DateTime.Now - startTime);
                 Log($"   总共耗时:{span.Hours}小时{span.Minutes}分{span.Seconds}秒{span.Milliseconds}毫秒");
                 Log("");

+ 37 - 0
Library/Vit.Db.DbMng/SqlerFile/BackupInfo.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Vit.Db.DbMng.SqlerFile
+{
+    class BackupInfo
+    {
+        /// <summary>
+        /// 数据库类型:mssql、mysql
+        /// </summary>
+        public string type;
+
+        /// <summary>
+        /// 数据库版本
+        /// </summary>
+        public string version;
+
+
+        /// <summary>
+        /// 备份时间
+        /// </summary>
+        public string backupTime;
+
+        /// <summary>
+        /// 数据库还原指令
+        /// </summary>
+        public string[][] cmd;
+
+
+        /// <summary>
+        /// 拆分sql脚本的字符串(正则)
+        /// </summary>
+        public string sqlSplit;
+
+    }
+}

+ 160 - 0
Library/Vit.Db.DbMng/SqlerFile/SqlerHelp.cs

@@ -0,0 +1,160 @@
+using Dapper;
+using System;
+using System.Data;
+using System.IO;
+using System.Text.RegularExpressions;
+using Vit.Core.Module.Log;
+using Vit.Extensions;
+using Vit.Orm.Dapper;
+
+namespace Vit.Db.DbMng.SqlerFile
+{
+    class SqlerBackuper
+    {
+
+        public int importedRowCount = 0;
+        public int importedTableCount = 0;
+
+
+        public string dirPath;
+        public IDbConnection conn;
+        public Action<string> Log;
+
+
+        public Regex sqlSplit = null;
+
+        public BackupInfo backupInfo;
+
+        public void ReadBackupInfo() 
+        {
+            // info.json
+            var filePath = Path.Combine(dirPath, "info.json");
+
+            backupInfo = null;
+
+            if (File.Exists(filePath))
+                backupInfo = File.ReadAllText(filePath, System.Text.Encoding.UTF8)?.Deserialize<BackupInfo>();
+
+            if (backupInfo == null)
+            {
+                backupInfo = new BackupInfo
+                {
+                    cmd = new[] {
+                       new[]{ "execSqlFile", "CreateDataBase.sql"},
+                        new[]{ "importSqlite", "Data.sqlite3" }
+                    }
+                };
+            }
+
+            if (!string.IsNullOrEmpty(backupInfo.sqlSplit))
+            {
+                sqlSplit = new Regex(backupInfo.sqlSplit);
+            }
+
+            Log("     数据库类型:" + backupInfo.type);
+            Log("     数据库版本:" + backupInfo.version);
+            Log("     备份时间  :" + backupInfo.backupTime);
+            Log("     sqlSplit  :" + sqlSplit.ToString());            
+        }
+
+
+        public void ExecCmd(string[]cmd) 
+        {
+            switch (cmd[0]) 
+            {
+                case "execSqlFile":
+                    #region execSqlFile
+                    {
+                        Log("    执行脚本文件 " + cmd[1]);
+
+                        var filePath = Path.Combine(dirPath, cmd[1]);                                 
+
+                        var sqlText = File.ReadAllText(filePath, System.Text.Encoding.UTF8);
+                        
+                        //确保conn打开
+                        conn.MakeSureOpen(() =>
+                        {
+                            using (var tran = conn.BeginTransaction())
+                            {
+                                try
+                                {
+                                  
+                                    if (sqlSplit == null)
+                                    {
+                                        conn.Execute(sqlText, transaction: tran);
+                                    }
+                                    else
+                                    {
+                                        var sqls = sqlSplit.Split(sqlText);
+                                        foreach (String sql in sqls)
+                                        {
+                                            if (!String.IsNullOrEmpty(sql.Trim()))
+                                            {
+                                                conn.Execute(sql, transaction: tran);
+                                            }
+                                        }
+                                    }
+                                    tran.Commit();
+                                }
+                                catch (Exception ex)
+                                {
+                                    Logger.Error(ex);
+                                    tran.Rollback();
+                                    throw;
+                                }
+                            }
+                        });
+
+                        Log("");
+                        Log("    成功");
+                    }
+                    #endregion
+
+                    break;
+                case "importSqlite":
+                    #region importSqlite
+                    {
+                        Log("    导入sqlite文件 " + cmd[1]);
+
+                        var filePath = Path.Combine(dirPath, cmd[1]);            
+                    
+
+                        int sumRowCount = 0;
+                        int sumTableCount;
+ 
+                        using (var connSqlite = ConnectionFactory.Sqlite_GetOpenConnectionByFilePath(filePath, Version: 3))
+                        {
+                            var tableNames = connSqlite.Sqlite_GetAllTableName();
+                            sumTableCount = tableNames.Count;
+                            int tbIndex = 0;
+
+                            foreach (var tableName in tableNames)
+                            {
+                                tbIndex++;
+
+                                Log("");
+                                Log($" ----[{tbIndex}/{sumTableCount}]import table " + tableName);
+
+                                int rowCount;
+                                using (var dr = connSqlite.ExecuteReader($"select * from {connSqlite.Quote(tableName)}"))
+                                {
+                                    rowCount = conn.BulkImport(dr, tableName);
+                                    sumRowCount += rowCount;
+                                }
+                                Log($"     table imported. row count: " + rowCount + ",  sum: " + sumRowCount);
+
+                                importedRowCount += rowCount;
+                                importedTableCount++;
+                            }
+                        }
+                        Log("");
+                        Log("    成功,table count: " + sumTableCount + ",  row count: " + sumRowCount);
+                    }
+                    #endregion
+                    break;
+            }
+        }
+
+
+    }
+}