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

Commit a2e8338

Browse files
committed
Massive re-factor, remove ThreadStatics store on managed OrmLite Connection/Command where possible
1 parent 8d328f4 commit a2e8338

File tree

53 files changed

+919
-624
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+919
-624
lines changed

src/ServiceStack.OrmLite.Firebird/FirebirdOrmLiteDialectProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -684,7 +684,7 @@ private string Quote(string name)
684684

685685
public override string GetColumnNames(ModelDefinition modelDef)
686686
{
687-
if (QuoteNames) return modelDef.GetColumnNames();
687+
if (QuoteNames) return modelDef.GetColumnNames(this);
688688
var sqlColumns = new StringBuilder();
689689
modelDef.FieldDefinitions.ForEach(x =>
690690
sqlColumns.AppendFormat("{0} {1}",

src/ServiceStack.OrmLite.MySql/MySqlDialectProvider.cs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public override string ToPostCreateTableStatement(ModelDefinition modelDef)
5858
{
5959
var triggerName = RowVersionTriggerFormat.Fmt(modelDef.ModelName);
6060
var triggerBody = "SET NEW.{0} = OLD.{0} + 1;".Fmt(
61-
modelDef.RowVersion.FieldName.SqlColumn());
61+
modelDef.RowVersion.FieldName.SqlColumn(this));
6262

6363
var sql = "CREATE TRIGGER {0} BEFORE UPDATE ON {1} FOR EACH ROW BEGIN {2} END;".Fmt(
6464
triggerName, modelDef.ModelName, triggerBody);
@@ -241,7 +241,15 @@ protected MySqlConnection Unwrap(IDbConnection db)
241241

242242
protected MySqlCommand Unwrap(IDbCommand cmd)
243243
{
244-
return (MySqlCommand)cmd;
244+
var cmdAsync = cmd as MySqlCommand;
245+
if (cmdAsync != null)
246+
return cmdAsync;
247+
248+
var hasDb = cmd as IHasDbCommand;
249+
if (hasDb != null)
250+
return (MySqlCommand)hasDb.DbCommand;
251+
252+
throw new ArgumentException("{0} is not an MySqlCommand".Fmt(cmd.GetType().Name));
245253
}
246254

247255
protected MySqlDataReader Unwrap(IDataReader reader)

src/ServiceStack.OrmLite.Oracle.Tests/OrmLiteTestBase.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@ public class Config
1111
{
1212
public static IDbConnection OpenDbConnection()
1313
{
14-
var testBase = new OrmLiteTestBase();
15-
var connectionString = ConfigurationManager.ConnectionStrings["testDb"].ConnectionString;
16-
return testBase.OpenDbConnection(connectionString);
14+
var testBase = new OrmLiteTestBase
15+
{
16+
DbFactory = new OrmLiteConnectionFactory(
17+
ConfigurationManager.ConnectionStrings["testDb"].ConnectionString,
18+
OracleDialect.Provider)
19+
};
20+
return testBase.OpenDbConnection();
1721
}
1822
}
1923

@@ -36,9 +40,10 @@ public void TestFixtureSetUp()
3640
{
3741
LogManager.LogFactory = new ConsoleLogFactory();
3842

39-
OrmLiteConfig.DialectProvider = OracleOrmLiteDialectProvider.Instance;
43+
OrmLiteConfig.DialectProvider = OracleDialect.Provider;
4044
OrmLiteConfig.ClearCache();
4145
ConnectionString = GetFileConnectionString();
46+
DbFactory = new OrmLiteConnectionFactory(ConnectionString, OracleDialect.Provider);
4247
}
4348

4449
public void Log(string text)
@@ -47,11 +52,11 @@ public void Log(string text)
4752
}
4853

4954
public Dialect Dialect = Dialect.Oracle;
55+
public OrmLiteConnectionFactory DbFactory;
5056

51-
public virtual IDbConnection OpenDbConnection(string connString = null)
57+
public virtual IDbConnection OpenDbConnection()
5258
{
53-
connString = connString ?? ConnectionString;
54-
return connString.OpenDbConnection();
59+
return DbFactory.OpenDbConnection();
5560
}
5661

5762
protected void SuppressIfOracle(string reason, params object[] args)

src/ServiceStack.OrmLite.Oracle/OracleOrmLiteDialectProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public override string ToPostCreateTableStatement(ModelDefinition modelDef)
125125
var triggerName = NamingStrategy.ApplyNameRestrictions(
126126
RowVersionTriggerFormat.Fmt(modelDef.ModelName));
127127
var triggerBody = ":NEW.{0} := :OLD.{0}+1;".Fmt(
128-
modelDef.RowVersion.FieldName.SqlColumn());
128+
modelDef.RowVersion.FieldName.SqlColumn(this));
129129

130130
var sql = "CREATE TRIGGER {0} BEFORE UPDATE ON {1} FOR EACH ROW BEGIN {2} END;".Fmt(
131131
Quote(triggerName), modelDef.ModelName, triggerBody);

src/ServiceStack.OrmLite.SqlServer/SqlServerOrmLiteDialectProvider.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,15 @@ protected SqlConnection Unwrap(IDbConnection db)
476476

477477
protected SqlCommand Unwrap(IDbCommand cmd)
478478
{
479-
return (SqlCommand)cmd;
479+
var cmdAsync = cmd as SqlCommand;
480+
if (cmdAsync != null)
481+
return cmdAsync;
482+
483+
var hasDb = cmd as IHasDbCommand;
484+
if (hasDb != null)
485+
return (SqlCommand)hasDb.DbCommand;
486+
487+
throw new ArgumentException("{0} is not an SqlCommand".Fmt(cmd.GetType().Name));
480488
}
481489

482490
protected SqlDataReader Unwrap(IDataReader reader)

src/ServiceStack.OrmLite.Sqlite/SqliteOrmLiteDialectProviderBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ public override string ToPostCreateTableStatement(ModelDefinition modelDef)
6060
var tableName = GetTableName(modelDef);
6161
var triggerBody = "UPDATE {0} SET {1} = OLD.{1} + 1 WHERE {2} = NEW.{2};".Fmt(
6262
tableName,
63-
modelDef.RowVersion.FieldName.SqlColumn(),
64-
modelDef.PrimaryKey.FieldName.SqlColumn());
63+
modelDef.RowVersion.FieldName.SqlColumn(this),
64+
modelDef.PrimaryKey.FieldName.SqlColumn(this));
6565

6666
var sql = "CREATE TRIGGER {0} BEFORE UPDATE ON {1} FOR EACH ROW BEGIN {2} END;".Fmt(
6767
triggerName, tableName, triggerBody);

src/ServiceStack.OrmLite/Async/OrmLiteReadCommandExtensionsAsync.cs

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ internal static Task<IDataReader> ExecReaderAsync(this IDbCommand dbCmd, string
3030
dbCmd.CommandTimeout = OrmLiteConfig.CommandTimeout;
3131
dbCmd.CommandText = sql;
3232

33-
return OrmLiteConfig.DialectProvider.ExecuteReaderAsync(dbCmd, token);
33+
return dbCmd.GetDialectProvider().ExecuteReaderAsync(dbCmd, token);
3434
}
3535

3636
internal static Task<IDataReader> ExecReaderAsync(this IDbCommand dbCmd, string sql, IEnumerable<IDataParameter> parameters, CancellationToken token)
@@ -47,7 +47,7 @@ internal static Task<IDataReader> ExecReaderAsync(this IDbCommand dbCmd, string
4747
dbCmd.Parameters.Add(param);
4848
}
4949

50-
return OrmLiteConfig.DialectProvider.ExecuteReaderAsync(dbCmd, token);
50+
return dbCmd.GetDialectProvider().ExecuteReaderAsync(dbCmd, token);
5151
}
5252

5353
internal static Task<List<T>> SelectAsync<T>(this IDbCommand dbCmd, CancellationToken token)
@@ -58,7 +58,7 @@ internal static Task<List<T>> SelectAsync<T>(this IDbCommand dbCmd, Cancellation
5858
internal static Task<List<T>> SelectFmtAsync<T>(this IDbCommand dbCmd, CancellationToken token, string sqlFilter, params object[] filterParams)
5959
{
6060
return dbCmd.ConvertToListAsync<T>(
61-
OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), sqlFilter, filterParams), token);
61+
dbCmd.GetDialectProvider().ToSelectStatement(typeof(T), sqlFilter, filterParams), token);
6262
}
6363

6464
internal static Task<List<TModel>> SelectAsync<TModel>(this IDbCommand dbCmd, Type fromTableType, CancellationToken token)
@@ -68,27 +68,27 @@ internal static Task<List<TModel>> SelectAsync<TModel>(this IDbCommand dbCmd, Ty
6868

6969
internal static Task<List<TModel>> SelectFmtAsync<TModel>(this IDbCommand dbCmd, CancellationToken token, Type fromTableType, string sqlFilter, params object[] filterParams)
7070
{
71-
var sql = OrmLiteReadCommandExtensions.ToSelectFmt<TModel>(fromTableType, sqlFilter, filterParams);
71+
var sql = OrmLiteReadCommandExtensions.ToSelectFmt<TModel>(dbCmd.GetDialectProvider(), fromTableType, sqlFilter, filterParams);
7272

7373
return dbCmd.ConvertToListAsync<TModel>(sql.ToString(), token);
7474
}
7575

7676
internal static Task<T> SelectByIdFmtAsync<T>(this IDbCommand dbCmd, object idValue, CancellationToken token)
7777
{
78-
return dbCmd.SingleFmtAsync<T>(token, OrmLiteConfig.DialectProvider.GetQuotedColumnName(ModelDefinition<T>.PrimaryKeyName) + " = {0}".SqlFmt(idValue));
78+
return dbCmd.SingleFmtAsync<T>(token, dbCmd.GetDialectProvider().GetQuotedColumnName(ModelDefinition<T>.PrimaryKeyName) + " = {0}".SqlFmt(idValue));
7979
}
8080

8181
internal static Task<T> SingleFmtAsync<T>(this IDbCommand dbCmd, CancellationToken token, string filter, params object[] filterParams)
8282
{
83-
return dbCmd.ConvertToAsync<T>(OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), filter, filterParams), token);
83+
return dbCmd.ConvertToAsync<T>(dbCmd.GetDialectProvider().ToSelectStatement(typeof(T), filter, filterParams), token);
8484
}
8585

8686
internal static Task<List<T>> SelectByIdsAsync<T>(this IDbCommand dbCmd, IEnumerable idValues, CancellationToken token)
8787
{
8888
var sql = idValues.GetIdsInSql();
8989
return sql == null
9090
? new List<T>().InTask()
91-
: SelectFmtAsync<T>(dbCmd, token, OrmLiteConfig.DialectProvider.GetQuotedColumnName(ModelDefinition<T>.PrimaryKeyName) + " IN (" + sql + ")");
91+
: SelectFmtAsync<T>(dbCmd, token, dbCmd.GetDialectProvider().GetQuotedColumnName(ModelDefinition<T>.PrimaryKeyName) + " IN (" + sql + ")");
9292
}
9393

9494
internal static Task<T> SingleByIdAsync<T>(this IDbCommand dbCmd, object value, CancellationToken token)
@@ -125,7 +125,7 @@ internal static Task<T> SingleAsync<T>(this IDbCommand dbCmd, string sql, object
125125

126126
dbCmd.SetParameters<T>(anonType, excludeDefaults: false);
127127

128-
return dbCmd.ConvertToAsync<T>(OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), sql), token);
128+
return dbCmd.ConvertToAsync<T>(dbCmd.GetDialectProvider().ToSelectStatement(typeof(T), sql), token);
129129
}
130130

131131
internal static Task<List<T>> WhereAsync<T>(this IDbCommand dbCmd, string name, object value, CancellationToken token)
@@ -150,7 +150,7 @@ internal static Task<List<T>> WhereAsync<T>(this IDbCommand dbCmd, object anonTy
150150
internal static Task<List<T>> SelectAsync<T>(this IDbCommand dbCmd, string sql, object anonType, CancellationToken token)
151151
{
152152
if (anonType != null) dbCmd.SetParameters<T>(anonType, excludeDefaults: false);
153-
dbCmd.CommandText = OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), sql);
153+
dbCmd.CommandText = dbCmd.GetDialectProvider().ToSelectStatement(typeof(T), sql);
154154

155155
return OrmLiteReadCommandExtensions.IsScalar<T>()
156156
? dbCmd.ColumnAsync<T>(null, token)
@@ -161,7 +161,7 @@ internal static Task<List<T>> SelectAsync<T>(this IDbCommand dbCmd, string sql,
161161
{
162162
if (dict != null) dbCmd.SetParameters((IDictionary<string, object>)dict, (bool)false);
163163

164-
dbCmd.CommandText = OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), sql);
164+
dbCmd.CommandText = dbCmd.GetDialectProvider().ToSelectStatement(typeof(T), sql);
165165

166166
return OrmLiteReadCommandExtensions.IsScalar<T>()
167167
? dbCmd.ColumnAsync<T>(null, token)
@@ -237,7 +237,7 @@ internal static Task<List<T>> SelectNonDefaultsAsync<T>(this IDbCommand dbCmd, s
237237
{
238238
if (anonType != null) dbCmd.SetParameters<T>(anonType, excludeDefaults: true);
239239

240-
return dbCmd.ConvertToListAsync<T>(OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), sql), token);
240+
return dbCmd.ConvertToListAsync<T>(dbCmd.GetDialectProvider().ToSelectStatement(typeof(T), sql), token);
241241
}
242242

243243
internal static Task<T> ScalarAsync<T>(this IDbCommand dbCmd, string sql, object anonType, CancellationToken token)
@@ -252,33 +252,32 @@ internal static Task<T> ScalarFmtAsync<T>(this IDbCommand dbCmd, CancellationTok
252252
return dbCmd.ScalarAsync<T>(sql.SqlFmt(sqlParams), token);
253253
}
254254

255-
internal static Task<T> ScalarAsync<T>(this IDataReader reader, CancellationToken token)
255+
internal static Task<T> ScalarAsync<T>(this IDataReader reader, IOrmLiteDialectProvider dialectProvider, CancellationToken token)
256256
{
257-
return OrmLiteConfig.DialectProvider.ReaderRead(reader, () =>
258-
OrmLiteReadCommandExtensions.ToScalar<T>(reader.GetValue(0)), token);
257+
return dialectProvider.ReaderRead(reader, () =>
258+
OrmLiteReadCommandExtensions.ToScalar<T>(dialectProvider, reader.GetValue(0)), token);
259259
}
260260

261261
public static Task<long> LongScalarAsync(this IDbCommand dbCmd, CancellationToken token)
262262
{
263-
return OrmLiteConfig.DialectProvider.ExecuteScalarAsync(dbCmd, token)
263+
return dbCmd.GetDialectProvider().ExecuteScalarAsync(dbCmd, token)
264264
.Then(OrmLiteReadCommandExtensions.ToLong);
265265
}
266266

267267
internal static Task<List<T>> ColumnAsync<T>(this IDbCommand dbCmd, string sql, object anonType, CancellationToken token)
268268
{
269269
if (anonType != null) dbCmd.SetParameters<T>(anonType, excludeDefaults: false);
270270

271-
return dbCmd.ColumnAsync<T>(OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), sql), token);
271+
return dbCmd.ColumnAsync<T>(dbCmd.GetDialectProvider().ToSelectStatement(typeof(T), sql), token);
272272
}
273273

274274
internal static Task<List<T>> ColumnFmtAsync<T>(this IDbCommand dbCmd, CancellationToken token, string sql, params object[] sqlParams)
275275
{
276276
return dbCmd.ColumnAsync<T>(sql.SqlFmt(sqlParams), token);
277277
}
278278

279-
internal static Task<List<T>> ColumnAsync<T>(this IDataReader reader, CancellationToken token)
279+
internal static Task<List<T>> ColumnAsync<T>(this IDataReader reader, IOrmLiteDialectProvider dialectProvider, CancellationToken token)
280280
{
281-
var dialectProvider = OrmLiteConfig.DialectProvider;
282281
return dialectProvider.ReaderEach(reader, () =>
283282
{
284283
var value = dialectProvider.ConvertDbValue(reader.GetValue(0), typeof(T));
@@ -304,9 +303,8 @@ internal static Task<HashSet<T>> ColumnDistinctFmtAsync<T>(this IDbCommand dbCmd
304303
return dbCmd.ColumnDistinctAsync<T>(sql.SqlFmt(sqlParams), token);
305304
}
306305

307-
internal static Task<HashSet<T>> ColumnDistinctAsync<T>(this IDataReader reader, CancellationToken token)
306+
internal static Task<HashSet<T>> ColumnDistinctAsync<T>(this IDataReader reader, IOrmLiteDialectProvider dialectProvider, CancellationToken token)
308307
{
309-
var dialectProvider = OrmLiteConfig.DialectProvider;
310308
return dialectProvider.ReaderEach(reader, () =>
311309
{
312310
var value = dialectProvider.ConvertDbValue(reader.GetValue(0), typeof(T));
@@ -333,11 +331,10 @@ internal static Task<Dictionary<K, List<V>>> LookupFmtAsync<K, V>(this IDbComman
333331
return dbCmd.LookupAsync<K, V>(sql.SqlFmt(sqlParams), token);
334332
}
335333

336-
internal static Task<Dictionary<K, List<V>>> LookupAsync<K, V>(this IDataReader reader, CancellationToken token)
334+
internal static Task<Dictionary<K, List<V>>> LookupAsync<K, V>(this IDataReader reader, IOrmLiteDialectProvider dialectProvider, CancellationToken token)
337335
{
338336
var lookup = new Dictionary<K, List<V>>();
339337

340-
var dialectProvider = OrmLiteConfig.DialectProvider;
341338
return dialectProvider.ReaderEach(reader, () =>
342339
{
343340
var key = (K)dialectProvider.ConvertDbValue(reader.GetValue(0), typeof(K));
@@ -366,11 +363,10 @@ internal static Task<Dictionary<K, V>> DictionaryFmtAsync<K, V>(this IDbCommand
366363
return dbCmd.DictionaryAsync<K, V>(sqlFormat.SqlFmt(sqlParams), token);
367364
}
368365

369-
internal static Task<Dictionary<K, V>> DictionaryAsync<K, V>(this IDataReader reader, CancellationToken token)
366+
internal static Task<Dictionary<K, V>> DictionaryAsync<K, V>(this IDataReader reader, IOrmLiteDialectProvider dialectProvider, CancellationToken token)
370367
{
371368
var map = new Dictionary<K, V>();
372369

373-
var dialectProvider = OrmLiteConfig.DialectProvider;
374370
return dialectProvider.ReaderEach(reader, () =>
375371
{
376372
var key = (K)dialectProvider.ConvertDbValue(reader.GetValue(0), typeof(K));
@@ -383,7 +379,7 @@ internal static Task<bool> ExistsAsync<T>(this IDbCommand dbCmd, object anonType
383379
{
384380
if (anonType != null) dbCmd.SetParameters(anonType, excludeDefaults: true);
385381

386-
var sql = OrmLiteConfig.DialectProvider.ToExecuteProcedureStatement(anonType)
382+
var sql = dbCmd.GetDialectProvider().ToExecuteProcedureStatement(anonType)
387383
?? dbCmd.GetFilterSql<T>();
388384

389385
return dbCmd.ScalarAsync(sql, token).Then(x => x != null);
@@ -393,14 +389,14 @@ internal static Task<bool> ExistsAsync<T>(this IDbCommand dbCmd, string sql, obj
393389
{
394390
if (anonType != null) dbCmd.SetParameters(anonType, (bool)false);
395391

396-
return dbCmd.ScalarAsync(OrmLiteConfig.DialectProvider.ToSelectStatement(typeof(T), sql), token)
392+
return dbCmd.ScalarAsync(dbCmd.GetDialectProvider().ToSelectStatement(typeof(T), sql), token)
397393
.Then(x => x != null);
398394
}
399395

400396
internal static Task<bool> ExistsFmtAsync<T>(this IDbCommand dbCmd, CancellationToken token, string sqlFilter, params object[] filterParams)
401397
{
402398
var fromTableType = typeof(T);
403-
return dbCmd.ScalarAsync(OrmLiteConfig.DialectProvider.ToSelectStatement(fromTableType, sqlFilter, filterParams), token)
399+
return dbCmd.ScalarAsync(dbCmd.GetDialectProvider().ToSelectStatement(fromTableType, sqlFilter, filterParams), token)
404400
.Then(x => x != null);
405401
}
406402

@@ -417,7 +413,7 @@ internal static Task<List<TOutputModel>> SqlProcedureFmtAsync<TOutputModel>(this
417413
{
418414
var modelType = typeof(TOutputModel);
419415

420-
string sql = OrmLiteConfig.DialectProvider.ToSelectFromProcedureStatement(
416+
string sql = dbCmd.GetDialectProvider().ToSelectFromProcedureStatement(
421417
fromObjWithProperties, modelType, sqlFilter, filterParams);
422418

423419
return dbCmd.ConvertToListAsync<TOutputModel>(sql, token);

0 commit comments

Comments
 (0)