| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | using Microsoft.IdentityModel.Tokens;using Microsoft.Win32;using System.Data;using System.Diagnostics;using System.Net.Sockets;using System.Text;using Universal;namespace Test;internal class Program{    static void Main()    {        CompressTest test = new();        test.Test();        //DBTest test = new();        //test.Initialize();        //test.Test();        //test.TestSystem();        //test.TestOthers();        //test.TestRaw();        //ProcessTest processTest = new();        //processTest.Initialize();        //processTest.BackUp("10.4.6.48", 5432, "postgres", "123456", "D://source_db_dump.custom", "tin01_db");        //processTest.BackUpSingleTable("localhost", 5432, "postgres", "123456", "D://source_db_dump.custom", "FROMTIN", "20250630.PM1");        //processTest.BackUpByDateTime("localhost", 5432, "postgres", "123456", "D://source_db_dump.custom", "FROMTIN", "20250630");        //processTest.Restore("localhost", 5432, "postgres", "123456", "D://source_db_dump.custom", "DBTestTIN");    }}internal class ProcessTest{    //HKEY_LOCAL_MACHINE\SOFTWARE\PostgreSQL\Installations\postgresql*    private string? _binPath;    private string? pg_dump;    private string? pg_restore;    public bool Initialize()    {        RegistryKey key = Registry.LocalMachine;        key = key.OpenSubKey("SOFTWARE\\PostgreSQL\\Installations");        if (key is null)            key = key.OpenSubKey("SOFTWARE\\WOW6432Node\\PostgreSQL\\Installations");        if (key is null)            return false;        if (key.GetSubKeyNames().FirstOrDefault(t => t.Contains("postgresql")) is not string nextKey)            return false;        key = key.OpenSubKey(nextKey);        if (key.GetValue("Base Directory") is not string path)            return false;        this.pg_dump = Path.Combine(path, "bin", "pg_dump.exe");        this.pg_restore = Path.Combine(path, "bin", "pg_restore.exe");        return true;    }    public bool BackUp(string serverAddress, int port, string userName, string password, string savePath, string dbName)    {        if (string.IsNullOrEmpty(this.pg_dump))            return false;        Process process = new Process();        process.StartInfo.Environment.Add("PGPASSWORD", password);        process.StartInfo.FileName = this.pg_dump;        process.StartInfo.Arguments = string.Format($"-h {serverAddress} -p {port} -U {userName} -F c -v -f \"{savePath}\" {dbName}");        process.StartInfo.CreateNoWindow = false;        process.Start();        process.WaitForExit();        return true;    }    public bool Restore(string serverAddress, int port, string userName, string password, string savePath, string dbName)    {        if (string.IsNullOrEmpty(this.pg_restore))            return false;        Process process = new Process();        process.StartInfo.Environment.Add("PGPASSWORD", password);        process.StartInfo.FileName = this.pg_restore;        process.StartInfo.Arguments = string.Format($"-h {serverAddress} -p {port} -U {userName} -v -d {dbName} --clean \"{savePath}\"");        process.StartInfo.CreateNoWindow = false;        process.Start();        process.WaitForExit();        return true;    }    public bool BackUpSingleTable(string serverAddress, int port, string userName, string password, string savePath, string dbName, string tableName)    {        if (string.IsNullOrEmpty(this.pg_dump))            return false;        Process process = new Process();        process.StartInfo.RedirectStandardOutput = true;        process.StartInfo.StandardOutputEncoding = Encoding.UTF8;        process.StartInfo.Environment.Add("PGPASSWORD", password);        process.StartInfo.FileName = this.pg_dump;        process.StartInfo.Arguments = string.Format($"-h {serverAddress} -p {port} -U {userName} -F c -v -f \"{savePath}\" --table \"{tableName}\" {dbName}");        process.StartInfo.CreateNoWindow = false;        process.Start();        process.WaitForExit();        return true;    }    public bool BackUpByDateTime(string serverAddress, int port, string userName, string password, string savePath, string dbName, string time)    {        if (string.IsNullOrEmpty(this.pg_dump))            return false;        Process process = new Process();        process.StartInfo.RedirectStandardOutput = true;        process.StartInfo.StandardOutputEncoding = Encoding.UTF8;        process.StartInfo.Environment.Add("PGPASSWORD", password);        process.StartInfo.FileName = this.pg_dump;        process.StartInfo.Arguments = string.Format($"-h {serverAddress} -p {port} -U {userName} -F c -v -f \"{savePath}\" --table {time}* {dbName}");        process.StartInfo.CreateNoWindow = false;        process.Start();        process.WaitForExit();        return true;    }}internal class CompressTest{    public void Test()    {        using MemoryStream stream = new();        Compressor.CompressZipFileDirectory(new(@"E:\Recipes"), stream);        Console.WriteLine(this.SplitSpan(stream, CallBack) ? "Send Success" : "Send Failed");    }    private bool CallBack(byte[] input, int current, int total)    {        Console.WriteLine($"{input.Length} {current} / {total}");        return true;    }    private bool SplitSpan(MemoryStream stream, Func<byte[], int, int, bool> callBack, int packLength = 4096)    {        if (packLength < 256)            return false;        Span<byte> t = stream.ToArray();        int count = t.Length / packLength;        Span<byte> ts;        for (int i = 0; i <= count; i++)        {            if (i == count)            {                ts = t.Slice(i * packLength);                if (callBack?.Invoke(ts.ToArray(), i, count) != true)                    return false;                break;            }            ts = t.Slice(i * packLength, packLength);            if (callBack?.Invoke(ts.ToArray(), i, count) != true)                return false;        }        return true;    }}
 |