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

Commit 16ac261

Browse files
committed
Revert back to ReturnOnInsert + clear Sequence PR and tests
1 parent c1dd345 commit 16ac261

File tree

5 files changed

+81
-131
lines changed

5 files changed

+81
-131
lines changed

src/ServiceStack.OrmLite.SqlServer/SqlServer2012OrmLiteDialectProvider.cs

Lines changed: 3 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,6 @@ public override bool DoesSequenceExist(IDbCommand dbCmd, string sequenceName)
2323
return result != null;
2424
}
2525

26-
private string Sequence(string schema, string sequence)
27-
{
28-
if (schema == null)
29-
return GetQuotedName(sequence);
30-
31-
var escapedSchema = NamingStrategy.GetSchemaName(schema)
32-
.Replace(".", "\".\"");
33-
34-
return GetQuotedName(escapedSchema)
35-
+ "."
36-
+ GetQuotedName(sequence);
37-
}
38-
3926
protected override string GetAutoIncrementDefinition(FieldDefinition fieldDef)
4027
{
4128
if (fieldDef.AutoIncrement && !string.IsNullOrEmpty(fieldDef.Sequence))
@@ -44,64 +31,10 @@ protected override string GetAutoIncrementDefinition(FieldDefinition fieldDef)
4431
return AutoIncrementDefinition;
4532
}
4633

47-
public override void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICollection<string> insertFields = null)
48-
{
49-
var sbColumnNames = StringBuilderCache.Allocate();
50-
var sbColumnValues = StringBuilderCacheAlt.Allocate();
51-
var sbReturningColumns = StringBuilderCacheAlt.Allocate();
52-
var modelDef = OrmLiteUtils.GetModelDefinition(typeof(T));
53-
54-
cmd.Parameters.Clear();
55-
56-
foreach (var fieldDef in modelDef.FieldDefinitionsArray)
57-
{
58-
if (fieldDef.ReturnOnInsert || (fieldDef.IsPrimaryKey && fieldDef.AutoIncrement && modelDef.HasReturnAttribute))
59-
{
60-
if (sbReturningColumns.Length > 0)
61-
sbReturningColumns.Append(",");
62-
sbReturningColumns.Append($"INSERTED.{GetQuotedColumnName(fieldDef.FieldName)}");
63-
}
64-
65-
if (fieldDef.ShouldSkipInsert() && !fieldDef.AutoIncrement && string.IsNullOrEmpty(fieldDef.Sequence))
66-
continue;
67-
68-
//insertFields contains Property "Name" of fields to insert ( that's how expressions work )
69-
if (insertFields != null && !insertFields.Contains(fieldDef.Name, StringComparer.OrdinalIgnoreCase))
70-
continue;
71-
72-
if (sbColumnNames.Length > 0)
73-
sbColumnNames.Append(",");
74-
if (sbColumnValues.Length > 0)
75-
sbColumnValues.Append(",");
76-
77-
try
78-
{
79-
sbColumnNames.Append(GetQuotedColumnName(fieldDef.FieldName));
80-
81-
if (fieldDef.AutoIncrement || !string.IsNullOrEmpty(fieldDef.Sequence))
82-
{
83-
sbColumnValues.Append($"NEXT VALUE FOR {Sequence(NamingStrategy.GetSchemaName(modelDef), fieldDef.Sequence)}");
84-
}
85-
else
86-
{
87-
sbColumnValues.Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName)));
88-
AddParameter(cmd, fieldDef);
89-
}
90-
}
91-
catch (Exception ex)
92-
{
93-
Log.Error("ERROR in PrepareParameterizedInsertStatement(): " + ex.Message, ex);
94-
throw;
95-
}
96-
}
97-
98-
var strReturning = StringBuilderCacheAlt.ReturnAndFree(sbReturningColumns);
99-
strReturning = strReturning.Length > 0 ? "OUTPUT " + strReturning + " " : "";
100-
cmd.CommandText = $"INSERT INTO {GetQuotedTableName(modelDef)} ({StringBuilderCache.ReturnAndFree(sbColumnNames)}) " +
101-
strReturning +
102-
$"VALUES ({StringBuilderCacheAlt.ReturnAndFree(sbColumnValues)})";
103-
}
34+
protected override bool ShouldSkipInsert(FieldDefinition fieldDef) => fieldDef.ShouldSkipInsert() && !fieldDef.AutoIncrement && string.IsNullOrEmpty(fieldDef.Sequence);
10435

36+
protected override bool SupportsSequences(FieldDefinition fieldDef) => fieldDef.AutoIncrement || !string.IsNullOrEmpty(fieldDef.Sequence);
37+
10538
public override List<string> ToCreateSequenceStatements(Type tableType)
10639
{
10740
var modelDef = GetModel(tableType);

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -255,14 +255,14 @@ public override string ToInsertRowStatement(IDbCommand cmd, object objWithProper
255255

256256
foreach (var fieldDef in modelDef.FieldDefinitionsArray)
257257
{
258-
if (fieldDef.ReturnOnInsert || (fieldDef.IsPrimaryKey && fieldDef.AutoIncrement && modelDef.HasReturnAttribute))
258+
if (ShouldReturnOnInsert(modelDef, fieldDef))
259259
{
260260
if (sbReturningColumns.Length > 0)
261261
sbReturningColumns.Append(",");
262262
sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));
263263
}
264264

265-
if (fieldDef.ShouldSkipInsert())
265+
if (ShouldSkipInsert(fieldDef))
266266
continue;
267267

268268
if (insertFields.Count > 0 && !insertFields.Contains(fieldDef.Name, StringComparer.OrdinalIgnoreCase))
@@ -297,6 +297,26 @@ public override string ToInsertRowStatement(IDbCommand cmd, object objWithProper
297297
return sql;
298298
}
299299

300+
protected string Sequence(string schema, string sequence)
301+
{
302+
if (schema == null)
303+
return GetQuotedName(sequence);
304+
305+
var escapedSchema = NamingStrategy.GetSchemaName(schema)
306+
.Replace(".", "\".\"");
307+
308+
return GetQuotedName(escapedSchema)
309+
+ "."
310+
+ GetQuotedName(sequence);
311+
}
312+
313+
protected virtual bool ShouldReturnOnInsert(ModelDefinition modelDef, FieldDefinition fieldDef) =>
314+
fieldDef.ReturnOnInsert || (fieldDef.IsPrimaryKey && fieldDef.AutoIncrement && modelDef.HasReturnAttribute);
315+
316+
protected virtual bool ShouldSkipInsert(FieldDefinition fieldDef) => fieldDef.ShouldSkipInsert();
317+
318+
protected virtual bool SupportsSequences(FieldDefinition fieldDef) => false;
319+
300320
public override void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICollection<string> insertFields = null)
301321
{
302322
var sbColumnNames = StringBuilderCache.Allocate();
@@ -308,14 +328,14 @@ public override void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICol
308328

309329
foreach (var fieldDef in modelDef.FieldDefinitionsArray)
310330
{
311-
if (fieldDef.ReturnOnInsert || (fieldDef.IsPrimaryKey && fieldDef.AutoIncrement && modelDef.HasReturnAttribute))
331+
if (ShouldReturnOnInsert(modelDef, fieldDef))
312332
{
313333
if (sbReturningColumns.Length > 0)
314334
sbReturningColumns.Append(",");
315335
sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));
316336
}
317337

318-
if (fieldDef.ShouldSkipInsert())
338+
if (ShouldSkipInsert(fieldDef))
319339
continue;
320340

321341
//insertFields contains Property "Name" of fields to insert ( that's how expressions work )
@@ -330,9 +350,16 @@ public override void PrepareParameterizedInsertStatement<T>(IDbCommand cmd, ICol
330350
try
331351
{
332352
sbColumnNames.Append(GetQuotedColumnName(fieldDef.FieldName));
333-
sbColumnValues.Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName)));
334353

335-
AddParameter(cmd, fieldDef);
354+
if (SupportsSequences(fieldDef))
355+
{
356+
sbColumnValues.Append("NEXT VALUE FOR " + Sequence(NamingStrategy.GetSchemaName(modelDef), fieldDef.Sequence));
357+
}
358+
else
359+
{
360+
sbColumnValues.Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName)));
361+
AddParameter(cmd, fieldDef);
362+
}
336363
}
337364
catch (Exception ex)
338365
{
@@ -361,14 +388,14 @@ public override void PrepareInsertRowStatement<T>(IDbCommand dbCmd, Dictionary<s
361388
{
362389
var fieldDef = modelDef.GetFieldDefinition(entry.Key);
363390

364-
if (fieldDef.ReturnOnInsert || (fieldDef.IsPrimaryKey && fieldDef.AutoIncrement && modelDef.HasReturnAttribute))
391+
if (ShouldReturnOnInsert(modelDef, fieldDef))
365392
{
366393
if (sbReturningColumns.Length > 0)
367394
sbReturningColumns.Append(",");
368395
sbReturningColumns.Append("INSERTED." + GetQuotedColumnName(fieldDef.FieldName));
369396
}
370397

371-
if (fieldDef.ShouldSkipInsert())
398+
if (ShouldSkipInsert(fieldDef))
372399
continue;
373400

374401
var value = entry.Value;

src/ServiceStack.OrmLite.SqlServerTests/ReturnAttributeTests.cs

Lines changed: 40 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,36 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
6-
using System.Data;
1+
using System.Data;
72
using System.Configuration;
83
using ServiceStack.DataAnnotations;
9-
using ServiceStack.Data;
10-
using ServiceStack;
114
using ServiceStack.OrmLite;
12-
using ServiceStack.OrmLite.SqlServer;
135
using NUnit.Framework;
6+
using ServiceStack.Logging;
147

158
namespace ReturnAttributeTests
169
{
17-
public class User
10+
public class UserSequence
1811
{
19-
[Return]
20-
[PrimaryKey]
21-
[AutoIncrement]
22-
[Sequence("Gen_User_Id")]
12+
[Sequence("Gen_UserSequence_Id"), ReturnOnInsert]
2313
public int Id { get; set; }
2414

2515
public string Name { get; set; }
2616
public string UserName { get; set; }
2717
public string Email { get; set; }
2818
}
2919

30-
public class User2
20+
public class UserSequence3
3121
{
32-
[Return]
33-
[PrimaryKey]
34-
[AutoIncrement]
35-
[Sequence("Gen_User_Id")]
22+
[Sequence("Gen_UserSequence_Id"), ReturnOnInsert]
3623
public int Id { get; set; }
3724

3825
public string Name { get; set; }
3926
public string UserName { get; set; }
4027
public string Email { get; set; }
4128

42-
[Return]
43-
[Sequence("Gen_Counter_Id")]
29+
[Sequence("Gen_Counter")]
4430
public int Counter { get; set; }
31+
32+
[Sequence("Gen_Counter_Return"), ReturnOnInsert]
33+
public int CounterReturn { get; set; }
4534
}
4635

4736
public class TestsBase
@@ -50,14 +39,21 @@ public class TestsBase
5039

5140
protected string ConnectionString { get; set; }
5241
protected IOrmLiteDialectProvider DialectProvider { get; set; }
53-
protected OrmLiteConnectionFactory DbFactory => (dbFactory == null) ? dbFactory = new OrmLiteConnectionFactory(ConnectionString, DialectProvider) : dbFactory;
42+
protected OrmLiteConnectionFactory DbFactory => dbFactory ?? (dbFactory = new OrmLiteConnectionFactory(ConnectionString, DialectProvider));
5443

5544
public TestsBase()
5645
{
5746
}
5847

5948
protected void Init()
6049
{
50+
LogManager.LogFactory = new ConsoleLogFactory(debugEnabled:true);
51+
}
52+
53+
public IDbConnection OpenDbConnection()
54+
{
55+
Init();
56+
return DbFactory.OpenDbConnection();
6157
}
6258
}
6359

@@ -70,14 +66,13 @@ public ReturnAttributeTests(): base()
7066
}
7167

7268
[Test]
73-
public void TestIdOnInsert()
69+
public void Does_use_and_return_Sequence_on_Insert()
7470
{
75-
Init();
76-
using (var db = DbFactory.Open())
71+
using (var db = OpenDbConnection())
7772
{
78-
db.CreateTable<User>(true);
73+
db.DropAndCreateTable<UserSequence>();
7974

80-
var user = new User { Name = "me", Email = "[email protected]" };
75+
var user = new UserSequence { Name = "me", Email = "[email protected]" };
8176
user.UserName = user.Email;
8277

8378
db.Insert(user);
@@ -86,14 +81,13 @@ public void TestIdOnInsert()
8681
}
8782

8883
[Test]
89-
public void TestIdOnSave()
84+
public void Does_use_and_return_Sequence_on_Save()
9085
{
91-
Init();
92-
using (var db = DbFactory.Open())
86+
using (var db = OpenDbConnection())
9387
{
94-
db.CreateTable<User>(true);
88+
db.DropAndCreateTable<UserSequence>();
9589

96-
var user = new User { Name = "me", Email = "[email protected]" };
90+
var user = new UserSequence { Name = "me", Email = "[email protected]" };
9791
user.UserName = user.Email;
9892

9993
db.Save(user);
@@ -102,36 +96,38 @@ public void TestIdOnSave()
10296
}
10397

10498
[Test]
105-
public void TestTwoSequencesOnInsert()
99+
public void Can_use_3_Sequences_on_Insert()
106100
{
107-
Init();
108-
using (var db = DbFactory.Open())
101+
using (var db = OpenDbConnection())
109102
{
110-
db.CreateTable<User2>(true);
103+
db.DropAndCreateTable<UserSequence3>();
111104

112-
var user = new User2 { Name = "me", Email = "[email protected]" };
105+
var user = new UserSequence3 { Name = "me", Email = "[email protected]" };
113106
user.UserName = user.Email;
114107

115108
db.Insert(user);
116109
Assert.That(user.Id, Is.GreaterThan(0), "normal Insert");
117-
Assert.That(user.Counter, Is.GreaterThan(0), "counter sequence ok");
110+
Assert.That(user.CounterReturn, Is.GreaterThan(0), "counter sequence ok");
111+
Assert.That(user.Counter, Is.EqualTo(0));
112+
113+
var dbUser = db.SingleById<UserSequence3>(user.Id);
114+
Assert.That(dbUser.Counter, Is.GreaterThan(0));
118115
}
119116
}
120117

121118
[Test]
122-
public void TestSqlOnInsert()
119+
public void Does_generate_Sql_with_Sequence()
123120
{
124-
Init();
125-
using (var db = DbFactory.Open())
121+
using (var db = OpenDbConnection())
126122
{
127-
db.CreateTable<User>(true);
123+
db.DropAndCreateTable<UserSequence>();
128124

129-
var user = new User { Name = "me", Email = "[email protected]" };
125+
var user = new UserSequence { Name = "me", Email = "[email protected]" };
130126
user.UserName = user.Email;
131127

132128
var id = db.Insert(user);
133129
var sql = db.GetLastSql();
134-
Assert.That(sql, Is.EqualTo("INSERT INTO \"User\" (\"Id\",\"Name\",\"UserName\",\"Email\") OUTPUT INSERTED.\"Id\" VALUES (NEXT VALUE FOR \"Gen_User_Id\",@Name,@UserName,@Email)"), "normal Insert");
130+
Assert.That(sql, Is.EqualTo("INSERT INTO \"UserSequence\" (\"Id\",\"Name\",\"UserName\",\"Email\") OUTPUT INSERTED.\"Id\" VALUES (NEXT VALUE FOR \"Gen_UserSequence_Id\",@Name,@UserName,@Email)"), "normal Insert");
135131
}
136132
}
137133
}

src/ServiceStack.OrmLite/ModelDefinition.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,9 @@ public ModelDefinition()
4747

4848
public bool HasAutoIncrementId => PrimaryKey != null && PrimaryKey.AutoIncrement;
4949

50-
public bool HasReturnAttribute
51-
{
52-
get { return this.FieldDefinitions.First(x => x.ReturnOnInsert) != null; }
53-
}
50+
public bool HasReturnAttribute => this.FieldDefinitions.Any(x => x.ReturnOnInsert);
5451

55-
public bool HasSequenceAttribute
56-
{
57-
get { return this.FieldDefinitions.First(x => !x.Sequence.IsNullOrEmpty()) != null; }
58-
}
52+
public bool HasSequenceAttribute => this.FieldDefinitions.Any(x => !x.Sequence.IsNullOrEmpty());
5953

6054
public FieldDefinition RowVersion { get; set; }
6155

src/ServiceStack.OrmLite/OrmLiteConfigExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ internal static ModelDefinition GetModelDefinition(this Type modelType)
149149
IsRowVersion = isRowVersion,
150150
IgnoreOnInsert = propertyInfo.HasAttribute<IgnoreOnInsertAttribute>(),
151151
IgnoreOnUpdate = propertyInfo.HasAttribute<IgnoreOnUpdateAttribute>(),
152-
ReturnOnInsert = propertyInfo.HasAttribute<ReturnAttribute>(),
152+
ReturnOnInsert = propertyInfo.HasAttribute<ReturnOnInsertAttribute>(),
153153
FieldLength = stringLengthAttr?.MaximumLength,
154154
DefaultValue = defaultValueAttr?.DefaultValue,
155155
CheckConstraint = chkConstraintAttr?.Constraint,

0 commit comments

Comments
 (0)