aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs20
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs7
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs2
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs3
-rw-r--r--docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs30
5 files changed, 36 insertions, 26 deletions
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs
index 800594d..4a594bb 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ColumnInfo.cs
@@ -6,10 +6,7 @@ namespace CrupestApi.Commons.Crud;
public class ColumnHooks
{
- /// <summary>
- /// If value is null, then it might because the column does not designated a value or it is designated null.
- /// </summary>
- public delegate void ColumnHookAction(ColumnInfo column, ref object? value);
+ public delegate void ColumnHookAction(ColumnInfo column, ref object? value, bool specified);
public ColumnHooks(ColumnHookAction afterSelect, ColumnHookAction beforeInsert, ColumnHookAction beforeUpdate)
{
@@ -133,18 +130,18 @@ public class ColumnInfo
private void TryCoerceStringFromNullToEmpty(ref object? value)
{
- if (ColumnType.ClrType == typeof(string) && (Metadata.GetValueOrDefault<bool?>(ColumnMetadataKeys.DefaultEmptyForString) ?? false) && value is null)
+ if (ColumnType.ClrType == typeof(string) && (Metadata.GetValueOrDefault<bool?>(ColumnMetadataKeys.DefaultEmptyForString) is true) && (value is null || value is DbNullValue))
{
value = "";
}
}
- protected void OnAfterSelect(ColumnInfo column, ref object? value)
+ protected void OnAfterSelect(ColumnInfo column, ref object? value, bool specified)
{
TryCoerceStringFromNullToEmpty(ref value);
}
- protected void OnBeforeInsert(ColumnInfo column, ref object? value)
+ protected void OnBeforeInsert(ColumnInfo column, ref object? value, bool specified)
{
if (column.IsClientGenerate && value is not null)
{
@@ -156,18 +153,13 @@ public class ColumnInfo
OnBeforeSet(column, ref value);
}
- protected void OnBeforeUpdate(ColumnInfo column, ref object? value)
+ protected void OnBeforeUpdate(ColumnInfo column, ref object? value, bool specified)
{
if (column.IsNoUpdate)
{
throw new UserException($"'{column.ColumnName}' is not updatable.");
}
- if ((column.UpdateBehavior & UpdateBehavior.NullIsSetNull) != 0 && value is null)
- {
- value = DbNullValue.Instance;
- }
-
OnBeforeSet(column, ref value);
}
@@ -175,7 +167,7 @@ public class ColumnInfo
{
TryCoerceStringFromNullToEmpty(ref value);
- if (value is null && column.IsNotNull)
+ if ((value is null || value is DbNullValue) && column.IsNotNull)
{
throw new UserException($"{column.ColumnName} can't be null.");
}
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs
index 7f248cf..7645b09 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/InsertClause.cs
@@ -1,10 +1,12 @@
using System.Text;
-using Dapper;
namespace CrupestApi.Commons.Crud;
public class InsertItem
{
+ /// <summary>
+ /// Null means use default value. Use <see cref="DbNullValue"/>.
+ /// </summary>
public InsertItem(string columnName, object? value)
{
ColumnName = columnName;
@@ -54,7 +56,7 @@ public class InsertClause : IInsertClause
public string GenerateColumnListSql(string? dbProviderId = null)
{
- return string.Join(", ", Items.Select(i => i.ColumnName));
+ return string.Join(", ", Items.Where(i => i.Value is not null).Select(i => i.ColumnName));
}
public (string sql, ParamList parameters) GenerateValueListSql(string? dbProviderId = null)
@@ -64,6 +66,7 @@ public class InsertClause : IInsertClause
for (var i = 0; i < Items.Count; i++)
{
var item = Items[i];
+ if (item.Value is null) continue;
var parameterName = parameters.AddRandomNameParameter(item.Value, item.ColumnName);
sb.Append($"@{parameterName}");
if (i != Items.Count - 1)
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs
index a1aaa45..0a43c67 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/OrderByClause.cs
@@ -1,5 +1,3 @@
-using Dapper;
-
namespace CrupestApi.Commons.Crud;
public class OrderByItem
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs
index 4b253b7..fe8d2a0 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/ParamMap.cs
@@ -3,6 +3,9 @@ using System.Diagnostics;
namespace CrupestApi.Commons.Crud;
+/// <summary>
+/// Null value will be thrown. Please use <see cref="DbNullValue.Instance"/>.
+/// </summary>
public record ParamInfo(string Name, object? Value, string? ColumnName = null);
public class ParamList : List<ParamInfo>
diff --git a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
index 93d02fd..d2f48c6 100644
--- a/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
+++ b/docker/crupest-api/CrupestApi/CrupestApi.Commons/Crud/TableInfo.cs
@@ -1,5 +1,4 @@
using System.Data;
-using System.Diagnostics;
using System.Reflection;
using System.Text;
using Dapper;
@@ -368,7 +367,12 @@ CREATE TABLE {tableName}(
var result = new DynamicParameters();
foreach (var param in parameters)
{
- if (param.Value is null || param.Value is DbNullValue)
+ if (param.Value is null)
+ {
+ continue;
+ }
+
+ if (param.Value is DbNullValue)
{
result.Add(param.Name, null);
continue;
@@ -418,10 +422,17 @@ CREATE TABLE {tableName}(
{
object? value = null;
var dynamicProperty = dynamicType.GetProperty(column.ColumnName);
- if (dynamicProperty is not null) value = dynamicProperty.GetValue(d);
- if (value is not null)
- value = column.ColumnType.ConvertFromDatabase(value);
- column.Hooks.AfterSelect(column, ref value);
+ if (dynamicProperty is null)
+ {
+ column.Hooks.AfterSelect(column, ref value, false);
+ }
+ else
+ {
+ value = dynamicProperty.GetValue(d);
+ if (value is not null)
+ value = column.ColumnType.ConvertFromDatabase(value);
+ column.Hooks.AfterSelect(column, ref value, true);
+ }
var propertyInfo = column.PropertyInfo;
if (propertyInfo is not null)
{
@@ -443,8 +454,11 @@ CREATE TABLE {tableName}(
foreach (var column in ColumnInfos)
{
InsertItem? item = insert.Items.FirstOrDefault(i => i.ColumnName == column.ColumnName);
- var value = item?.Value;
- column.Hooks.BeforeInsert(column, ref value);
+ object? value = null;
+ if (item is null || item.Value is null)
+ {
+ column.Hooks.BeforeInsert(column, , );
+ }
if (item is null)
{
item = new InsertItem(column.ColumnName, value);