/// <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);
        }
Exemplo n.º 2
0
        /// <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");
        }
Exemplo n.º 3
0
        /// <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 ...");
        }
Exemplo n.º 4
0
        /// <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);
            }
        }