/// <summary> /// 停止数据库 /// </summary> /// <param name="host"></param> /// <returns></returns> public static IWebHost UseStopDataBase(this IWebHost host) { var options = new DataBaseOptions(); var applicationLifetime = host.Services.GetService <IApplicationLifetime>(); applicationLifetime.ApplicationStopped.Register(obj => { DataBaseUtil.StopDataBase((DataBaseOptions)obj, p => Console.WriteLine(p)); }, options); return(host); }
/// <summary> /// 在停止website时,停止数据库 /// 注意只有正常使用ctrl+c的关闭程序才有效 /// </summary> /// <param name="options"></param> /// <param name="StandardOutput"></param> /// <example> /// public static IWebHost BuildWebHost(string[] args) => /// WebHost.CreateDefaultBuilder(args) /// .UseStartDataBase() /// .UseStartup<Startup>() /// .Build() /// .UseStopDataBase(); /// </example> public static void StopDataBase(DataBaseOptions options, Action <string> StandardOutput = null) { var pid = Path.Combine(options.DataBasePath, "postmaster.pid"); if (File.Exists(pid)) { StandardOutput?.Invoke("pgsql stoping ..."); var binpath = Path.Combine(options.DataBaseSetupPath, "bin"); string strCmd = $"pg_ctl -D {options.DataBasePath} stop"; var vLine = RunInDirTimeoutPipeline(binpath, strCmd, Console.OutputEncoding, StandardOutput); } StandardOutput?.Invoke("database stop successfully"); }
/// <summary> /// 在启动website时,启动数据库 /// </summary> /// <param name="options"></param> /// <param name="StandardOutput"></param> /// <example> /// public static IWebHost BuildWebHost(string[] args) => /// WebHost.CreateDefaultBuilder(args) /// .UseStartDataBase() /// .UseStartup<Startup>() /// .Build() /// .UseStopDataBase(); /// </example> public static void StartDataBase(DataBaseOptions options, Action <string> StandardOutput = null) { if (!Directory.Exists(options.DataBaseSetupPath)) { StandardOutput?.Invoke("unzip database files ..."); UnZipFile(options.DataBaseSetupPath, StandardOutput); } if (!Directory.Exists(options.DataBasePath)) { StandardOutput?.Invoke("init database ..."); InitPgSql(options, StandardOutput); } var pid = Path.Combine(options.DataBasePath, "postmaster.pid"); if (File.Exists(pid)) { var vpid = File.ReadAllLines(pid); if (vpid.Length > 0 && int.TryParse(vpid[0], out int spid)) { try { var postpro = Process.GetProcessById(spid); if (postpro != null && postpro.ProcessName.Equals("postgres", StringComparison.OrdinalIgnoreCase)) { StandardOutput?.Invoke("database runing ..."); return; } } catch { } } } StandardOutput?.Invoke("start database ..."); string strCmd = $"pg_ctl -D {options.DataBasePath} -l logfile start"; var binpath = Path.Combine(options.DataBaseSetupPath, "bin"); var vLine = RunInDirTimeoutPipeline(binpath, strCmd, Console.OutputEncoding, StandardOutput); StandardOutput?.Invoke("database runing ..."); }
/// <summary> /// 初始化数据库,创建postgres账号,密码默认 postgres@123 /// </summary> /// <param name="options"></param> /// <param name="StandardOutput"></param> private static void InitPgSql(DataBaseOptions options, Action <string> StandardOutput = null) { var binpath = Path.Combine(options.DataBaseSetupPath, "bin"); string pwdfile = Path.Combine(binpath, "pwd.txt"); System.IO.File.WriteAllText(pwdfile, "postgres@123"); string strCmd = $"initdb -D {options.DataBasePath} -E UTF-8 --locale=chs -A md5 -U postgres --pwfile={pwdfile}"; var vLine = RunInDirTimeoutPipeline(binpath, strCmd, Console.OutputEncoding, StandardOutput); SetConfig(Path.Combine(options.DataBaseSetupPath, "../initsql.conf"), Path.Combine(options.DataBasePath, "postgresql.conf")); if (System.IO.File.Exists(pwdfile)) { System.IO.File.Delete(pwdfile); } }