Program.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System.Windows.Forms;
  2. namespace AutorentWinForms;
  3. internal static class Program
  4. {
  5. [STAThread]
  6. private static void Main(string[] args)
  7. {
  8. ApplicationConfiguration.Initialize();
  9. var connectionString = AppSettings.LoadConnectionString();
  10. using var db = new Database(connectionString);
  11. if (args.Contains("--probe"))
  12. {
  13. var perms = db.Query("""
  14. SELECT current_database() AS db,
  15. has_database_privilege(current_user, current_database(), 'CREATE') AS can_create_db,
  16. has_schema_privilege(current_user, 'public', 'CREATE') AS can_create_public
  17. """);
  18. Console.WriteLine($"CURRENT {perms.Rows[0]["db"]} CREATE_DB={perms.Rows[0]["can_create_db"]} CREATE_PUBLIC={perms.Rows[0]["can_create_public"]}");
  19. var databases = db.Query("SELECT datname FROM pg_database WHERE datallowconn ORDER BY datname");
  20. Console.WriteLine("DATABASES");
  21. foreach (System.Data.DataRow row in databases.Rows)
  22. Console.WriteLine(row["datname"]);
  23. Console.WriteLine("SCHEMAS");
  24. var schemas = db.Query("SELECT schema_name FROM information_schema.schemata ORDER BY schema_name");
  25. foreach (System.Data.DataRow row in schemas.Rows)
  26. Console.WriteLine(row["schema_name"]);
  27. Console.WriteLine("TABLES");
  28. var tables = db.Query("""
  29. SELECT table_schema, table_name
  30. FROM information_schema.tables
  31. WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
  32. ORDER BY table_schema, table_name
  33. LIMIT 80
  34. """);
  35. foreach (System.Data.DataRow row in tables.Rows)
  36. Console.WriteLine($"{row["table_schema"]}.{row["table_name"]}");
  37. Console.WriteLine("COLUMNS");
  38. var columns = db.Query("""
  39. SELECT table_name, column_name, data_type
  40. FROM information_schema.columns
  41. WHERE table_schema = current_schema()
  42. AND table_name IN ('brand','car','client','rental','app_user','audit_log')
  43. ORDER BY table_name, ordinal_position
  44. """);
  45. foreach (System.Data.DataRow row in columns.Rows)
  46. Console.WriteLine($"{row["table_name"]}.{row["column_name"]}:{row["data_type"]}");
  47. return;
  48. }
  49. db.Initialize();
  50. if (args.Contains("--smoke-test"))
  51. {
  52. var clients = db.ExecuteScalarInt("SELECT COUNT(*) FROM client");
  53. var audit = db.ExecuteScalarInt("SELECT COUNT(*) FROM audit_log");
  54. var adminAuth = db.Authenticate("garanin_gi", "6qw#6xUyG%#")?.Role == "admin";
  55. var managerAuth = db.Authenticate("manager", "Manager123!")?.Role == "manager";
  56. var viewerAuth = db.Authenticate("shagavaliev_iv", "75&n057$380")?.Role == "viewer";
  57. Console.WriteLine($"OK: clients={clients}, audit={audit}, adminAuth={adminAuth}, managerAuth={managerAuth}, viewerAuth={viewerAuth}");
  58. return;
  59. }
  60. if (args.Contains("--insert-test"))
  61. {
  62. var stamp = DateTime.Now.ToString("yyyyMMddHHmmss");
  63. db.ExecuteNonQuery("BEGIN");
  64. try
  65. {
  66. db.ExecuteNonQuery(
  67. """
  68. INSERT INTO client(full_name, phone, address, license_no)
  69. VALUES(@name, @phone, @address, @license)
  70. """,
  71. new()
  72. {
  73. ["@name"] = "Проверка sequence",
  74. ["@phone"] = "+7999" + stamp,
  75. ["@address"] = "Тест",
  76. ["@license"] = "TEST" + stamp
  77. });
  78. var id = db.ExecuteScalarInt("SELECT MAX(client_id) FROM client");
  79. Console.WriteLine($"OK: inserted client_id={id}");
  80. }
  81. finally
  82. {
  83. db.ExecuteNonQuery("ROLLBACK");
  84. }
  85. return;
  86. }
  87. using var login = new LoginForm(db);
  88. if (login.ShowDialog() != DialogResult.OK || login.Session is null)
  89. return;
  90. Application.Run(new MainForm(db, login.Session));
  91. }
  92. }