aboutsummaryrefslogtreecommitdiff
path: root/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2024-11-11 01:12:29 +0800
committerYuqian Yang <crupest@crupest.life>2024-12-19 21:42:01 +0800
commitf9aa02ec1a4c24e80a206857d4f68198bb027bb4 (patch)
tree5994f0a62733b13f9f330e3515260ae20dc4a0bd /dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs
parent7b4d49e4bbdff6ddf1f8f7e937130e700024d5e9 (diff)
downloadcrupest-f9aa02ec1a4c24e80a206857d4f68198bb027bb4.tar.gz
crupest-f9aa02ec1a4c24e80a206857d4f68198bb027bb4.tar.bz2
crupest-f9aa02ec1a4c24e80a206857d4f68198bb027bb4.zip
HALF WORK: 2024.12.19
Re-organize file structure.
Diffstat (limited to 'dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs')
-rw-r--r--dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs73
1 files changed, 73 insertions, 0 deletions
diff --git a/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs b/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs
new file mode 100644
index 0000000..37d77ca
--- /dev/null
+++ b/dropped/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs
@@ -0,0 +1,73 @@
+using System.Data;
+using System.Diagnostics;
+
+namespace CrupestApi.Commons.Crud;
+
+/// <summary>
+/// <see cref="ColumnName"/> is an optional column name related to the param. You may use it to do some column related things. Like use a more accurate conversion.
+/// </summary>
+/// <remarks>
+/// If value is DbNullValue, it will be treated as null.
+/// </remarks>
+public record ParamInfo(string Name, object? Value, string? ColumnName = null);
+
+public class ParamList : List<ParamInfo>
+{
+ private static Random random = new Random();
+ private const string chars = "abcdefghijklmnopqrstuvwxyz";
+ public static string GenerateRandomKey(int length)
+ {
+ lock (random)
+ {
+ var result = new string(Enumerable.Repeat(chars, length)
+ .Select(s => s[random.Next(s.Length)]).ToArray());
+ return result;
+ }
+ }
+
+ public string GenerateRandomParameterName()
+ {
+ var parameterName = GenerateRandomKey(10);
+ int retryTimes = 1;
+ while (ContainsKey(parameterName))
+ {
+ retryTimes++;
+ Debug.Assert(retryTimes <= 100);
+ parameterName = GenerateRandomKey(10);
+ }
+ return parameterName;
+ }
+
+
+ public bool ContainsKey(string name)
+ {
+ return this.SingleOrDefault(p => p.Name.Equals(name, StringComparison.OrdinalIgnoreCase)) is not null;
+ }
+
+ public T? Get<T>(string key)
+ {
+ return (T?)this.SingleOrDefault(p => p.Name.Equals(key, StringComparison.OrdinalIgnoreCase))?.Value;
+ }
+
+ public object? this[string key]
+ {
+ get
+ {
+ return this.SingleOrDefault(p => p.Name.Equals(key, StringComparison.OrdinalIgnoreCase)) ?? throw new KeyNotFoundException("Key not found.");
+ }
+ }
+
+ public void Add(string name, object? value, string? columnName = null)
+ {
+ Add(new ParamInfo(name, value, columnName));
+ }
+
+ // Return the random name.
+ public string AddRandomNameParameter(object? value, string? columnName = null)
+ {
+ var parameterName = GenerateRandomParameterName();
+ var param = new ParamInfo(parameterName, value, columnName);
+ Add(param);
+ return parameterName;
+ }
+}