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

Commit c4e1d56

Browse files
committed
Add support for RowVersion to Save API's and add support for remaining RowVersion tests
1 parent cbf0e6c commit c4e1d56

File tree

5 files changed

+273
-19
lines changed

5 files changed

+273
-19
lines changed

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -122,21 +122,9 @@ public override string GetColumnDefinition(
122122
return sql.ToString();
123123
}
124124

125-
public override string GetColumnNames(ModelDefinition modelDef)
125+
public override string GetRowVersionColumnName(FieldDefinition field)
126126
{
127-
var sqlColumns = new StringBuilder();
128-
foreach (var field in modelDef.FieldDefinitions)
129-
{
130-
if (sqlColumns.Length > 0)
131-
sqlColumns.Append(", ");
132-
133-
if (field.IsRowVersion)
134-
sqlColumns.Append("xmin as " + GetQuotedColumnName(field.FieldName));
135-
else
136-
sqlColumns.Append(GetQuotedColumnName(field.FieldName));
137-
}
138-
139-
return sqlColumns.ToString();
127+
return "xmin as " + GetQuotedColumnName(field.FieldName);
140128
}
141129

142130
public override void AppendFieldCondition(StringBuilder sqlFilter, FieldDefinition fieldDef, IDbCommand cmd)

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ string ToSelectFromProcedureStatement(object fromObjWithProperties,
120120

121121
bool DoesSequenceExist(IDbCommand dbCmd, string sequencName);
122122

123+
string GetRowVersionColumnName(FieldDefinition field);
123124
string GetColumnNames(ModelDefinition modelDef);
124125

125126
SqlExpression<T> SqlExpression<T>();

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,10 @@ public virtual string ToSelectStatement(Type tableType, string sqlFilter, params
454454
return sqlFilter.SqlFmt(filterParams);
455455

456456
var modelDef = tableType.GetModelDefinition();
457-
var sql = new StringBuilder("SELECT " + GetColumnNames(modelDef) + " FROM " + GetQuotedTableName(modelDef));
457+
var sql = new StringBuilder();
458+
sql.AppendFormat("SELECT {0} FROM {1}",
459+
GetColumnNames(modelDef),
460+
GetQuotedTableName(modelDef));
458461

459462
if (!string.IsNullOrEmpty(sqlFilter))
460463
{
@@ -471,6 +474,11 @@ public virtual string ToSelectStatement(Type tableType, string sqlFilter, params
471474
return sql.ToString();
472475
}
473476

477+
public virtual string GetRowVersionColumnName(FieldDefinition field)
478+
{
479+
return GetQuotedColumnName(field.FieldName);
480+
}
481+
474482
public virtual string GetColumnNames(ModelDefinition modelDef)
475483
{
476484
var sqlColumns = new StringBuilder();
@@ -479,7 +487,10 @@ public virtual string GetColumnNames(ModelDefinition modelDef)
479487
if (sqlColumns.Length > 0)
480488
sqlColumns.Append(", ");
481489

482-
sqlColumns.Append(GetQuotedColumnName(field.FieldName));
490+
if (field.IsRowVersion)
491+
sqlColumns.Append(GetRowVersionColumnName(field));
492+
else
493+
sqlColumns.Append(GetQuotedColumnName(field.FieldName));
483494
}
484495

485496
return sqlColumns.ToString();

src/ServiceStack.OrmLite/OrmLiteWriteExtensions.cs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using System.Collections.Generic;
1515
using System.Data;
1616
using System.Linq;
17+
using System.Text;
1718
using System.Text.RegularExpressions;
1819
using ServiceStack.Logging;
1920

@@ -665,14 +666,16 @@ internal static bool Save<T>(this IDbCommand dbCmd, T obj)
665666
{
666667
var id = obj.GetId();
667668
var existingRow = id != null ? dbCmd.SingleById<T>(id) : default(T);
669+
var modelDef = typeof(T).GetModelDefinition();
670+
668671
if (Equals(existingRow, default(T)))
669672
{
670-
var modelDef = typeof(T).GetModelDefinition();
671673
if (modelDef.HasAutoIncrementId)
672674
{
673675
var newId = dbCmd.Insert(obj, selectIdentity: true);
674676
var safeId = OrmLiteConfig.DialectProvider.ConvertDbValue(newId, modelDef.PrimaryKey.FieldType);
675677
modelDef.PrimaryKey.SetValueFn(obj, safeId);
678+
id = newId;
676679
}
677680
else
678681
{
@@ -681,13 +684,21 @@ internal static bool Save<T>(this IDbCommand dbCmd, T obj)
681684

682685
dbCmd.Insert(obj);
683686
}
687+
688+
if (modelDef.RowVersion != null)
689+
modelDef.RowVersion.SetValueFn(obj, dbCmd.GetRowVersion(modelDef, id));
690+
684691
return true;
685692
}
686693

687694
if (OrmLiteConfig.UpdateFilter != null)
688695
OrmLiteConfig.UpdateFilter(dbCmd, obj);
689696

690697
dbCmd.Update(obj);
698+
699+
if (modelDef.RowVersion != null)
700+
modelDef.RowVersion.SetValueFn(obj, dbCmd.GetRowVersion(modelDef, id));
701+
691702
return false;
692703
}
693704

@@ -735,6 +746,7 @@ internal static int SaveAll<T>(this IDbCommand dbCmd, IEnumerable<T> objs)
735746
var newId = dbCmd.Insert(row, selectIdentity: true);
736747
var safeId = OrmLiteConfig.DialectProvider.ConvertDbValue(newId, modelDef.PrimaryKey.FieldType);
737748
modelDef.PrimaryKey.SetValueFn(row, safeId);
749+
id = newId;
738750
}
739751
else
740752
{
@@ -746,6 +758,9 @@ internal static int SaveAll<T>(this IDbCommand dbCmd, IEnumerable<T> objs)
746758

747759
rowsAdded++;
748760
}
761+
762+
if (modelDef.RowVersion != null)
763+
modelDef.RowVersion.SetValueFn(row, dbCmd.GetRowVersion(modelDef, id));
749764
}
750765

751766
if (dbTrans != null)
@@ -767,5 +782,23 @@ internal static void ExecuteProcedure<T>(this IDbCommand dbCommand, T obj)
767782
dbCommand.CommandType = CommandType.StoredProcedure;
768783
dbCommand.ExecuteSql(sql);
769784
}
785+
786+
internal static ulong GetRowVersion(this IDbCommand dbCmd, ModelDefinition modelDef, object id)
787+
{
788+
var idParamString = OrmLiteConfig.DialectProvider.GetParam();
789+
790+
var sql = string.Format("SELECT {0} FROM {1} WHERE {2} = {3}",
791+
OrmLiteConfig.DialectProvider.GetRowVersionColumnName(modelDef.RowVersion),
792+
OrmLiteConfig.DialectProvider.GetQuotedTableName(modelDef),
793+
OrmLiteConfig.DialectProvider.GetQuotedColumnName(modelDef.PrimaryKey.FieldName),
794+
idParamString);
795+
796+
var idParam = dbCmd.CreateParameter();
797+
idParam.ParameterName = idParamString;
798+
idParam.Value = id;
799+
dbCmd.Parameters.Add(idParam);
800+
801+
return dbCmd.Scalar<ulong>(sql);
802+
}
770803
}
771804
}

0 commit comments

Comments
 (0)