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

Commit 9f88298

Browse files
committed
Merge pull request #388 from jessemcdowell-AI/OptimisticConcurrencyOracle
Optimistic testing / fixes for Oracle
2 parents b8030fa + 2434c81 commit 9f88298

File tree

4 files changed

+21
-22
lines changed

4 files changed

+21
-22
lines changed

src/ServiceStack.OrmLite.Oracle.Tests/ServiceStack.OrmLite.Oracle.Tests.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,9 @@
204204
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\PerfTests.cs">
205205
<Link>PerfTests.cs</Link>
206206
</Compile>
207+
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\RowVersionTests.cs">
208+
<Link>RowVersionTests.cs</Link>
209+
</Compile>
207210
<Compile Include="..\..\tests\ServiceStack.OrmLite.Tests\Shared\ApiUtilExtensions.cs">
208211
<Link>Shared\ApiUtilExtensions.cs</Link>
209212
</Compile>

src/ServiceStack.OrmLite.Oracle/OracleOrmLiteDialectProvider.cs

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -109,27 +109,17 @@ public override void OnAfterInitColumnTypeMap()
109109
protected string ClientProvider = OdpProvider;
110110
public static string RowVersionTriggerFormat = "{0}RowVersionUpdateTrigger";
111111

112-
public override string ToPostDropTableStatement(ModelDefinition modelDef)
113-
{
114-
if (modelDef.RowVersion != null)
115-
{
116-
var triggerName = RowVersionTriggerFormat.Fmt(modelDef.ModelName);
117-
return "DROP TRIGGER IF EXISTS {0}".Fmt(GetQuotedTableName(triggerName));
118-
}
119-
120-
return null;
121-
}
122-
123112
public override string ToPostCreateTableStatement(ModelDefinition modelDef)
124113
{
125114
if (modelDef.RowVersion != null)
126115
{
127-
var triggerName = RowVersionTriggerFormat.Fmt(modelDef.ModelName);
116+
var triggerName = NamingStrategy.ApplyNameRestrictions(
117+
RowVersionTriggerFormat.Fmt(modelDef.ModelName));
128118
var triggerBody = ":NEW.{0} := :OLD.{0}+1;".Fmt(
129119
modelDef.RowVersion.FieldName.SqlColumn());
130120

131121
var sql = "CREATE TRIGGER {0} BEFORE UPDATE ON {1} FOR EACH ROW BEGIN {2} END;".Fmt(
132-
triggerName, modelDef.ModelName, triggerBody);
122+
Quote(triggerName), modelDef.ModelName, triggerBody);
133123

134124
return sql;
135125
}
@@ -319,7 +309,7 @@ public override void PrepareParameterizedInsertStatement<T>(IDbCommand dbCommand
319309
dbCommand.CommandTimeout = OrmLiteConfig.CommandTimeout;
320310
foreach (var fieldDef in modelDef.FieldDefinitions)
321311
{
322-
if (fieldDef.IsComputed) continue;
312+
if (fieldDef.IsComputed || fieldDef.IsRowVersion) continue;
323313

324314
//insertFields contains Property "Name" of fields to insert (that's how expressions work)
325315
if (insertFields.Count > 0 && !insertFields.Contains(fieldDef.Name)) continue;
@@ -771,7 +761,11 @@ public override string GetColumnDefinition(string fieldName, Type fieldType,
771761
var sql = new StringBuilder();
772762
sql.AppendFormat("{0} {1}", GetQuotedColumnName(fieldName), fieldDefinition);
773763

774-
if (!string.IsNullOrEmpty(defaultValue))
764+
if (isRowVersion)
765+
{
766+
sql.AppendFormat(DefaultValueFormat, 1L);
767+
}
768+
else if (!string.IsNullOrEmpty(defaultValue))
775769
{
776770
sql.AppendFormat(DefaultValueFormat, defaultValue);
777771
}

src/ServiceStack.OrmLite/OrmLiteWriteExtensions.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,7 @@ internal static ulong GetRowVersion(this IDbCommand dbCmd, ModelDefinition model
794794
OrmLiteConfig.DialectProvider.GetQuotedColumnName(modelDef.PrimaryKey.FieldName),
795795
idParamString);
796796

797+
dbCmd.Parameters.Clear();
797798
var idParam = dbCmd.CreateParameter();
798799
idParam.ParameterName = idParamString;
799800
idParam.Value = id;

tests/ServiceStack.OrmLite.Tests/RowVersionTests.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -101,15 +101,15 @@ public void Can_create_table_with_RowVersion()
101101
{
102102
db.DropAndCreateTable<ModelWithRowVersion>();
103103

104-
db.Insert(new ModelWithRowVersion { Text = "Text" });
104+
var rowId = db.Insert(new ModelWithRowVersion { Text = "Text" }, selectIdentity:true);
105105

106-
var row = db.SingleById<ModelWithRowVersion>(1);
106+
var row = db.SingleById<ModelWithRowVersion>(rowId);
107107

108108
row.Text += " Updated";
109109

110110
db.Update(row);
111111

112-
var updatedRow = db.SingleById<ModelWithRowVersion>(1);
112+
var updatedRow = db.SingleById<ModelWithRowVersion>(rowId);
113113

114114
Assert.That(updatedRow.Text, Is.EqualTo("Text Updated"));
115115
Assert.That(updatedRow.RowVersion, Is.GreaterThan(0));
@@ -130,15 +130,15 @@ public void Can_create_table_with_RowVersion_Alias()
130130
{
131131
db.DropAndCreateTable<ModelWithRowVersionAlias>();
132132

133-
db.Insert(new ModelWithRowVersionAlias { Text = "Text" });
133+
var rowId = db.Insert(new ModelWithRowVersionAlias { Text = "Text" }, selectIdentity:true);
134134

135-
var row = db.SingleById<ModelWithRowVersionAlias>(1);
135+
var row = db.SingleById<ModelWithRowVersionAlias>(rowId);
136136

137137
row.Text += " Updated";
138138

139139
db.Update(row);
140140

141-
var updatedRow = db.SingleById<ModelWithRowVersionAlias>(1);
141+
var updatedRow = db.SingleById<ModelWithRowVersionAlias>(rowId);
142142

143143
Assert.That(updatedRow.Text, Is.EqualTo("Text Updated"));
144144
Assert.That(updatedRow.RowVersion, Is.GreaterThan(0));
@@ -221,8 +221,9 @@ public void Can_SaveAll_new_rows_and_retrieve_rowversion()
221221
[Test]
222222
public void Can_Save_new_row_with_references_and_retrieve_child_rowversions()
223223
{
224+
db.DropTable<ModelWithRowVersionAndParent>();
224225
db.DropAndCreateTable<ModelWithOptimisticChildren>();
225-
db.DropAndCreateTable<ModelWithRowVersionAndParent>();
226+
db.CreateTable<ModelWithRowVersionAndParent>();
226227

227228
var row = new ModelWithOptimisticChildren
228229
{

0 commit comments

Comments
 (0)