From 46ee538c2ffe3ea76c647524c74c2ce6add8a2d3 Mon Sep 17 00:00:00 2001 From: crupest Date: Tue, 6 Dec 2022 11:58:37 +0800 Subject: Develop secret api. v13 --- .../CrupestApi.Commons/Crud/CrudService.cs | 8 ++ .../CrupestApi.Commons/Crud/InsertClause.cs | 88 ++++++++++++++++++++++ .../CrupestApi.Commons/Crud/TableInfo.cs | 27 ++++++- 3 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs index b7f74e6..bbd5e9a 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/CrudService.cs @@ -63,6 +63,14 @@ public class CrudService return await connection.QueryAsync(sql, parameters); } + public virtual async Task InsertAsync(InsertClause insert) + { + var connection = await EnsureDatabase(); + DynamicParameters parameters; + var sql = _table.GenerateInsertSql(insert, out parameters); + return await connection.ExecuteAsync(sql, parameters); + } + public virtual async Task UpdateAsync(WhereClause? where, UpdateClause update) { var connection = await EnsureDatabase(); diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs new file mode 100644 index 0000000..35b7cc9 --- /dev/null +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs @@ -0,0 +1,88 @@ +using System.Text; +using Dapper; + +namespace CrupestApi.Commons.Crud; + +public class InsertItem +{ + public InsertItem(string columnName, object? value) + { + ColumnName = columnName; + Value = value; + } + + public InsertItem(KeyValuePair pair) + { + ColumnName = pair.Key; + Value = pair.Value; + } + + public string ColumnName { get; set; } + public object? Value { get; set; } + + public static implicit operator KeyValuePair(InsertItem item) + { + return new(item.ColumnName, item.Value); + } + + public static implicit operator InsertItem(KeyValuePair pair) + { + return new(pair); + } +} + +public class InsertClause +{ + public List Items { get; } = new List(); + + public InsertClause(IEnumerable items) + { + Items.AddRange(items); + } + + public InsertClause(params InsertItem[] items) + { + Items.AddRange(items); + } + + public InsertClause Add(params InsertItem[] items) + { + Items.AddRange(items); + return this; + } + + public InsertClause Add(string column, object? value) + { + return Add(new InsertItem(column, value)); + } + + public static InsertClause Create(params InsertItem[] items) + { + return new InsertClause(items); + } + + public List GetRelatedColumns() + { + return Items.Select(i => i.ColumnName).ToList(); + } + + public string GenerateColumnListSql() + { + return string.Join(", ", Items.Select(i => i.ColumnName)); + } + + public string GenerateValueListSql(DynamicParameters parameters) + { + var sb = new StringBuilder(); + for (var i = 0; i < Items.Count; i++) + { + var item = Items[i]; + var parameterName = parameters.AddRandomNameParameter(item.Value); + sb.Append($"@{parameterName}"); + if (i != Items.Count - 1) + sb.Append(", "); + } + + return sb.ToString(); + } +} diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs index bf62df2..9610e40 100644 --- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs +++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs @@ -190,6 +190,31 @@ CREATE TABLE {tableName}( return result.ToString(); } + public string GenerateInsertSql(InsertClause insertClause, out DynamicParameters parameters) + { + var relatedColumns = insertClause.GetRelatedColumns(); + foreach (var column in relatedColumns) + { + if (!ColumnNameList.Contains(column)) + { + throw new ArgumentException($"Column {column} is not in the table."); + } + } + + parameters = new DynamicParameters(); + + var result = new StringBuilder() + .Append("INSERT INTO ") + .Append(TableName) + .Append(" (") + .Append(insertClause.GenerateColumnListSql()) + .Append(") VALUES (") + .Append(insertClause.GenerateValueListSql(parameters)) + .Append(");"); + + return result.ToString(); + } + public string GenerateUpdateSql(WhereClause? whereClause, UpdateClause updateClause, out DynamicParameters parameters) { var relatedColumns = new HashSet(); @@ -200,7 +225,7 @@ CREATE TABLE {tableName}( { if (!ColumnNameList.Contains(column)) { - throw new ArgumentException($"Field {column} is not in the table."); + throw new ArgumentException($"Column {column} is not in the table."); } } -- cgit v1.2.3