-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
127 lines (105 loc) · 4.63 KB
/
Program.cs
File metadata and controls
127 lines (105 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using Microsoft.Extensions.Configuration;
using AbstractFactoryDemo.Abstractions;
using AbstractFactoryDemo.Client;
using AbstractFactoryDemo.SqlServer;
using AbstractFactoryDemo.MySql;
using AbstractFactoryDemo.Oracle;
// Load configuration
var config = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false)
.Build();
// Honour Ctrl+C for the entire run
using var cts = new CancellationTokenSource();
Console.CancelKeyPress += (_, e) =>
{
e.Cancel = true;
Console.WriteLine("\n[!] Cancellation requested...");
cts.Cancel();
};
Console.WriteLine("==============================================");
Console.WriteLine(" Abstract Factory Pattern — Database Demo");
Console.WriteLine(" Table: TaskItem");
Console.WriteLine("==============================================");
Console.WriteLine("(Press Ctrl+C at any time to cancel)");
Console.WriteLine();
Console.WriteLine("Choose a database provider:");
Console.WriteLine("1. SQL Server");
Console.WriteLine("2. MySQL");
Console.WriteLine("3. Oracle");
Console.Write("Enter your choice (1-3): ");
string? choice = Console.ReadLine()?.Trim();
IDatabaseFactory factory;
string connectionString;
string selectSql, insertSql, updateSql, countSql;
switch (choice)
{
case "1":
Console.WriteLine("\nUsing SQL Server...");
factory = new SqlServerFactory();
connectionString = config.GetConnectionString("SqlServer")
?? throw new InvalidOperationException("SqlServer connection string not found in appsettings.json.");
selectSql = "SELECT [TaskItemId], [TaskName], [IsComplete] FROM [TaskItem]";
insertSql = "INSERT INTO [TaskItem] ([TaskName], [IsComplete]) VALUES (@TaskName, @IsComplete)";
updateSql = "UPDATE [TaskItem] SET [IsComplete] = @IsComplete WHERE [TaskItemId] = @TaskItemId";
countSql = "SELECT COUNT(*) FROM [TaskItem]";
break;
case "2":
Console.WriteLine("\nUsing MySQL...");
factory = new MySqlFactory();
connectionString = config.GetConnectionString("MySql")
?? throw new InvalidOperationException("MySql connection string not found in appsettings.json.");
selectSql = "SELECT TaskItemId, TaskName, IsComplete FROM TaskItem";
insertSql = "INSERT INTO TaskItem (TaskName, IsComplete) VALUES (@TaskName, @IsComplete)";
updateSql = "UPDATE TaskItem SET IsComplete = @IsComplete WHERE TaskItemId = @TaskItemId";
countSql = "SELECT COUNT(*) FROM TaskItem";
break;
case "3":
Console.WriteLine("\nUsing Oracle...");
factory = new OracleFactory();
connectionString = config.GetConnectionString("Oracle")
?? throw new InvalidOperationException("Oracle connection string not found in appsettings.json.");
selectSql = "SELECT TaskItemId, TaskName, IsComplete FROM TaskItem";
insertSql = "INSERT INTO TaskItem (TaskName, IsComplete) VALUES (:TaskName, :IsComplete)";
updateSql = "UPDATE TaskItem SET IsComplete = :IsComplete WHERE TaskItemId = :TaskItemId";
countSql = "SELECT COUNT(*) FROM TaskItem";
break;
default:
Console.WriteLine("Invalid choice. Exiting...");
return;
}
var client = new DatabaseClient(factory);
Console.WriteLine("\nRunning operations...");
try
{
// SELECT
await client.RunQueryAsync(connectionString, selectSql, ct: cts.Token);
// INSERT
await client.RunInsertAsync(connectionString, insertSql,
taskName: "New task from Abstract Factory demo",
isComplete: false,
ct: cts.Token);
// UPDATE — mark TaskItemId = 1 as complete
await client.RunUpdateAsync(connectionString, updateSql,
taskItemId: 1,
isComplete: true,
ct: cts.Token);
// COUNT
await client.RunScalarAsync(connectionString, countSql, ct: cts.Token);
// SELECT again to show state after insert + update
await client.RunQueryAsync(connectionString, selectSql, ct: cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("[!] Operation was cancelled.");
return;
}
Console.WriteLine("\n==============================================");
Console.WriteLine("Pattern Used: Abstract Factory");
Console.WriteLine("==============================================");
Console.WriteLine($"Selected Factory : {factory.GetType().Name}");
Console.WriteLine($"Dialect : {factory.Dialect.GetType().Name}");
Console.WriteLine($"Parameter prefix : {factory.Dialect.FormatParameter("x")}");
Console.WriteLine("DatabaseClient works only with abstractions.");
Console.WriteLine("Concrete implementations are chosen at runtime.");
Console.ReadLine();