Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 0e6d55d

Browse files
committed
Add support for Default Values and Variable placeholders
1 parent 3aa8d34 commit 0e6d55d

File tree

18 files changed

+183
-30
lines changed

18 files changed

+183
-30
lines changed

src/ServiceStack.OrmLite.Firebird/FirebirdOrmLiteDialectProvider.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public FirebirdOrmLiteDialectProvider(bool compactGuid)
4747
base.RegisterConverter<float>(new FirebirdFloatConverter());
4848
base.RegisterConverter<double>(new FirebirdDoubleConverter());
4949
base.RegisterConverter<decimal>(new FirebirdDecimalConverter());
50+
51+
this.Variables = new Dictionary<string, string>
52+
{
53+
{ OrmLiteVariables.SystemUtc, "CURRENT_TIMESTAMP" },
54+
};
5055
}
5156

5257
public override IDbConnection CreateConnection(string connectionString, Dictionary<string, string> options)
@@ -320,7 +325,7 @@ public override string ToCreateTableStatement(Type tableType)
320325
fieldDef.IsRowVersion,
321326
fieldDef.FieldLength,
322327
fieldDef.Scale,
323-
fieldDef.DefaultValue,
328+
GetDefaultValue(fieldDef),
324329
fieldDef.CustomFieldDefinition);
325330

326331
sbColumns.Append(columnDefinition);

src/ServiceStack.OrmLite.MySql/MySqlDialectProvider.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class MySqlDialectProvider : OrmLiteDialectProviderBase<MySqlDialectProvi
2323
public MySqlDialectProvider()
2424
{
2525
base.AutoIncrementDefinition = "AUTO_INCREMENT";
26-
base.DefaultValueFormat = " DEFAULT '{0}'";
26+
base.DefaultValueFormat = " DEFAULT {0}";
2727
base.SelectIdentitySql = "SELECT LAST_INSERT_ID()";
2828

2929
base.InitColumnTypeMap();
@@ -44,6 +44,11 @@ public MySqlDialectProvider()
4444
base.RegisterConverter<Guid>(new MySqlGuidConverter());
4545
base.RegisterConverter<DateTime>(new MySqlDateTimeConverter());
4646
base.RegisterConverter<DateTimeOffset>(new MySqlDateTimeOffsetConverter());
47+
48+
this.Variables = new Dictionary<string, string>
49+
{
50+
{ OrmLiteVariables.SystemUtc, "CURRENT_TIMESTAMP" },
51+
};
4752
}
4853

4954
public static string RowVersionTriggerFormat = "{0}RowVersionUpdateTrigger";
@@ -186,7 +191,7 @@ public string GetColumnDefinition(FieldDefinition fieldDef)
186191
fieldDef.IsRowVersion,
187192
fieldDef.FieldLength,
188193
fieldDef.Scale,
189-
fieldDef.DefaultValue,
194+
GetDefaultValue(fieldDef),
190195
fieldDef.CustomFieldDefinition);
191196

192197
if (fieldDef.IsRowVersion)

src/ServiceStack.OrmLite.Oracle/OracleOrmLiteDialectProvider.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,11 @@ public OracleOrmLiteDialectProvider(bool compactGuid, bool quoteNames, string cl
123123
RegisterConverter<DateTime>(new OracleDateTimeConverter());
124124
RegisterConverter<DateTimeOffset>(new OracleDateTimeOffsetConverter(_timestampConverter));
125125
RegisterConverter<bool>(new OracleBoolConverter());
126+
127+
this.Variables = new Dictionary<string, string>
128+
{
129+
{ OrmLiteVariables.SystemUtc, "sys_extract_utc(systimestamp)" },
130+
};
126131
}
127132

128133
//public override void OnAfterInitColumnTypeMap()
@@ -754,7 +759,7 @@ public override string ToCreateTableStatement(Type tableType)
754759
fieldDef.IsRowVersion,
755760
fieldDef.FieldLength,
756761
fieldDef.Scale,
757-
fieldDef.DefaultValue,
762+
GetDefaultValue(fieldDef),
758763
fieldDef.CustomFieldDefinition);
759764

760765
sbColumns.Append(columnDefinition);

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public PostgreSqlDialectProvider()
5656
//RegisterConverter<string[]>(new PostgreSqlStringArrayConverter());
5757
//RegisterConverter<int[]>(new PostgreSqlIntArrayConverter());
5858
//RegisterConverter<long[]>(new PostgreSqlLongArrayConverter());
59+
60+
this.Variables = new Dictionary<string, string>
61+
{
62+
{ OrmLiteVariables.SystemUtc, "now() at time zone 'utc'" },
63+
};
5964
}
6065

6166
public override string GetColumnDefinition(

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public SqlServerOrmLiteDialectProvider()
4141
base.RegisterConverter<Guid>(new SqlServerGuidConverter());
4242

4343
base.RegisterConverter<byte[]>(new SqlServerByteArrayConverter());
44+
45+
this.Variables = new Dictionary<string, string>
46+
{
47+
{ OrmLiteVariables.SystemUtc, "SYSUTCDATETIME()" },
48+
};
4449
}
4550

4651
public override string GetQuotedValue(string paramValue)

src/ServiceStack.OrmLite.Sqlite/SqliteOrmLiteDialectProviderBase.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ protected SqliteOrmLiteDialectProviderBase()
2222
base.RegisterConverter<Guid>(new SqliteGuidConverter());
2323
base.RegisterConverter<bool>(new SqliteBoolConverter());
2424
base.RegisterConverter<byte[]>(new SqliteByteArrayConverter());
25+
26+
this.Variables = new Dictionary<string, string>
27+
{
28+
{ OrmLiteVariables.SystemUtc, "CURRENT_TIMESTAMP" },
29+
};
2530
}
2631

2732
public static string Password { get; set; }

src/ServiceStack.OrmLite.VistaDB/VistaDbDialectProvider.cs

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,12 @@ public VistaDbDialectProvider()
5959
base.RegisterConverter<uint>(new VistaDbUInt32Converter());
6060

6161
base.RegisterConverter<TimeSpan>(new VistaDbTimeSpanAsIntConverter());
62-
base.RegisterConverter<Guid>(new VistaDbGuidConverter());
62+
base.RegisterConverter<Guid>(new VistaDbGuidConverter());
63+
64+
this.Variables = new Dictionary<string, string>
65+
{
66+
{ OrmLiteVariables.SystemUtc, "GetDate()" },
67+
};
6368
}
6469

6570
public override string GetQuotedValue(string paramValue)
@@ -114,43 +119,43 @@ public override string ToCreateTableStatement(Type tableType)
114119
var columns = new StringBuilder();
115120
var constraints = new StringBuilder();
116121

117-
foreach (var fd in modelDefinition.FieldDefinitions)
122+
foreach (var fieldDef in modelDefinition.FieldDefinitions)
118123
{
119124
if (columns.Length != 0)
120125
columns.Append(", \n ");
121126

122127
var columnDefinition = this.GetColumnDefinition(
123-
fd.FieldName,
124-
fd.ColumnType,
128+
fieldDef.FieldName,
129+
fieldDef.ColumnType,
125130
false,
126-
fd.AutoIncrement,
127-
fd.IsNullable,
128-
fd.IsRowVersion,
129-
fd.FieldLength,
130-
fd.Scale,
131-
fd.DefaultValue,
132-
fd.CustomFieldDefinition);
131+
fieldDef.AutoIncrement,
132+
fieldDef.IsNullable,
133+
fieldDef.IsRowVersion,
134+
fieldDef.FieldLength,
135+
fieldDef.Scale,
136+
GetDefaultValue(fieldDef),
137+
fieldDef.CustomFieldDefinition);
133138

134139
columns.Append(columnDefinition);
135140

136-
if (fd.IsPrimaryKey)
141+
if (fieldDef.IsPrimaryKey)
137142
{
138143
constraints.AppendFormat("ALTER TABLE {0} ADD CONSTRAINT {1} PRIMARY KEY ({2});\n",
139144
quotedTableName,
140145
this.GetQuotedName("PK_" + modelDefinition.ModelName),
141-
this.GetQuotedColumnName(fd.FieldName));
146+
this.GetQuotedColumnName(fieldDef.FieldName));
142147
}
143-
else if (fd.ForeignKey != null)
148+
else if (fieldDef.ForeignKey != null)
144149
{
145-
var foreignModelDefinition = OrmLiteUtils.GetModelDefinition(fd.ForeignKey.ReferenceType);
150+
var foreignModelDefinition = OrmLiteUtils.GetModelDefinition(fieldDef.ForeignKey.ReferenceType);
146151
constraints.AppendFormat("ALTER TABLE {0} ADD CONSTRAINT {1} FOREIGN KEY ({2}) REFERENCES {3} ({4}){5}{6};\n",
147152
quotedTableName,
148-
this.GetQuotedName(fd.ForeignKey.GetForeignKeyName(modelDefinition, foreignModelDefinition, this.NamingStrategy, fd)),
149-
this.GetQuotedColumnName(fd.FieldName),
153+
this.GetQuotedName(fieldDef.ForeignKey.GetForeignKeyName(modelDefinition, foreignModelDefinition, this.NamingStrategy, fieldDef)),
154+
this.GetQuotedColumnName(fieldDef.FieldName),
150155
this.GetQuotedTableName(foreignModelDefinition),
151156
this.GetQuotedColumnName(foreignModelDefinition.PrimaryKey.FieldName),
152-
this.GetForeignKeyOnDeleteClause(fd.ForeignKey),
153-
this.GetForeignKeyOnUpdateClause(fd.ForeignKey));
157+
this.GetForeignKeyOnDeleteClause(fieldDef.ForeignKey),
158+
this.GetForeignKeyOnUpdateClause(fieldDef.ForeignKey));
154159
}
155160
}
156161

src/ServiceStack.OrmLite/Async/OrmLiteWriteCommandExtensionsAsync.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,9 @@ internal static Task<long> InsertAsync<T>(this IDbCommand dbCmd, T obj, bool sel
248248

249249
var dialectProvider = dbCmd.GetDialectProvider();
250250

251-
dialectProvider.PrepareParameterizedInsertStatement<T>(dbCmd);
251+
dialectProvider.PrepareParameterizedInsertStatement<T>(dbCmd,
252+
insertFields: OrmLiteUtils.GetNonDefaultValueInsertFields(obj));
253+
252254
dialectProvider.SetParameterValues<T>(dbCmd, obj);
253255

254256
if (selectIdentity)

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public abstract class OrmLiteDialectProviderBase<TDialect>
3232

3333
protected OrmLiteDialectProviderBase()
3434
{
35+
Variables = new Dictionary<string, string>();
3536
StringSerializer = new JsvStringSerializer();
3637
}
3738

@@ -158,6 +159,8 @@ public virtual void InitDbParam(IDbDataParameter dbParam, Type columnType)
158159
converter.InitDbParam(dbParam, columnType);
159160
}
160161

162+
public Dictionary<string, string> Variables { get; set; }
163+
161164
public IOrmLiteExecFilter ExecFilter { get; set; }
162165

163166
public Dictionary<Type, IOrmLiteConverter> Converters = new Dictionary<Type, IOrmLiteConverter>();
@@ -262,8 +265,8 @@ public void RegisterConverter<T>(IOrmLiteConverter converter)
262265
public IOrmLiteConverter GetConverter(Type type)
263266
{
264267
IOrmLiteConverter converter;
265-
return Converters.TryGetValue(type, out converter)
266-
? converter
268+
return Converters.TryGetValue(type, out converter)
269+
? converter
267270
: null;
268271
}
269272

@@ -1045,6 +1048,21 @@ public virtual string ToDeleteStatement(Type tableType, string sqlFilter, params
10451048
return sql.ToString();
10461049
}
10471050

1051+
public virtual string GetDefaultValue(FieldDefinition fieldDef)
1052+
{
1053+
var defaultValue = fieldDef.DefaultValue;
1054+
if (string.IsNullOrEmpty(defaultValue))
1055+
return null;
1056+
1057+
if (!defaultValue.StartsWith("{"))
1058+
return defaultValue;
1059+
1060+
string variable;
1061+
return Variables.TryGetValue(defaultValue, out variable)
1062+
? variable
1063+
: null;
1064+
}
1065+
10481066
public virtual string ToCreateTableStatement(Type tableType)
10491067
{
10501068
var sbColumns = new StringBuilder();
@@ -1062,7 +1080,7 @@ public virtual string ToCreateTableStatement(Type tableType)
10621080
fieldDef.IsRowVersion,
10631081
fieldDef.FieldLength,
10641082
fieldDef.Scale,
1065-
fieldDef.DefaultValue,
1083+
GetDefaultValue(fieldDef),
10661084
fieldDef.CustomFieldDefinition);
10671085

10681086
if (columnDefinition == null)
@@ -1179,8 +1197,8 @@ protected virtual string GetCompositeIndexName(CompositeIndexAttribute composite
11791197
protected virtual string GetCompositeIndexNameWithSchema(CompositeIndexAttribute compositeIndex, ModelDefinition modelDef)
11801198
{
11811199
return compositeIndex.Name ?? GetIndexName(compositeIndex.Unique,
1182-
(modelDef.IsInSchema
1183-
? modelDef.Schema + "_" + GetQuotedTableName(modelDef)
1200+
(modelDef.IsInSchema
1201+
? modelDef.Schema + "_" + GetQuotedTableName(modelDef)
11841202
: GetQuotedTableName(modelDef)).SafeVarName(),
11851203
string.Join("_", compositeIndex.FieldNames.ToArray()));
11861204
}

src/ServiceStack.OrmLite/OrmLiteUtils.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,5 +561,24 @@ internal static void SetRefFieldChildResults<Parent>(List<Parent> parents, Model
561561
}
562562
}
563563

564+
public static List<string> GetNonDefaultValueInsertFields<T>(T obj)
565+
{
566+
var insertFields = new List<string>();
567+
var modelDef = typeof(T).GetModelDefinition();
568+
foreach (var fieldDef in modelDef.FieldDefinitionsArray)
569+
{
570+
if (!string.IsNullOrEmpty(fieldDef.DefaultValue))
571+
{
572+
var value = fieldDef.GetValue(obj);
573+
if (value == null || value.Equals(fieldDef.FieldTypeDefaultValue))
574+
continue;
575+
}
576+
insertFields.Add(fieldDef.Name);
577+
}
578+
579+
return insertFields.Count == modelDef.FieldDefinitionsArray.Length
580+
? null
581+
: insertFields;
582+
}
564583
}
565584
}

0 commit comments

Comments
 (0)