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

Commit 82cb548

Browse files
committed
Add Enable/DisableForeignKeysCheck + OpenTransactionIfNotExists APIs
1 parent 93fb52e commit 82cb548

File tree

5 files changed

+66
-35
lines changed

5 files changed

+66
-35
lines changed

src/ServiceStack.OrmLite/IOrmLiteDialectProvider.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,11 @@ public interface IOrmLiteDialectProvider
141141
void DisableIdentityInsert<T>(IDbCommand cmd);
142142
Task DisableIdentityInsertAsync<T>(IDbCommand cmd, CancellationToken token=default);
143143

144+
void EnableForeignKeysCheck(IDbCommand cmd);
145+
Task EnableForeignKeysCheckAsync(IDbCommand cmd, CancellationToken token=default);
146+
void DisableForeignKeysCheck(IDbCommand cmd);
147+
Task DisableForeignKeysCheckAsync(IDbCommand cmd, CancellationToken token=default);
148+
144149
Dictionary<string, FieldDefinition> GetFieldDefinitionMap(ModelDefinition modelDef);
145150

146151
object GetFieldValue(FieldDefinition fieldDef, object value);

src/ServiceStack.OrmLite/OrmLiteDialectProviderBase.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,12 @@ public virtual void EnableIdentityInsert<T>(IDbCommand cmd) {}
930930
public virtual void DisableIdentityInsert<T>(IDbCommand cmd) {}
931931
public virtual Task DisableIdentityInsertAsync<T>(IDbCommand cmd, CancellationToken token=default) => TypeConstants.EmptyTask;
932932

933+
public virtual void EnableForeignKeysCheck(IDbCommand cmd) {}
934+
public virtual Task EnableForeignKeysCheckAsync(IDbCommand cmd, CancellationToken token=default) => TypeConstants.EmptyTask;
935+
936+
public virtual void DisableForeignKeysCheck(IDbCommand cmd) {}
937+
public virtual Task DisableForeignKeysCheckAsync(IDbCommand cmd, CancellationToken token=default) => TypeConstants.EmptyTask;
938+
933939
public virtual void SetParameterValues<T>(IDbCommand dbCmd, object obj)
934940
{
935941
var modelDef = GetModel(typeof(T));

src/ServiceStack.OrmLite/OrmLiteExecFilter.cs

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -104,59 +104,50 @@ public virtual void Exec(IDbConnection dbConn, Action<IDbCommand> filter)
104104
}
105105
}
106106

107-
public virtual Task<T> Exec<T>(IDbConnection dbConn, Func<IDbCommand, Task<T>> filter)
107+
public virtual async Task<T> Exec<T>(IDbConnection dbConn, Func<IDbCommand, Task<T>> filter)
108108
{
109109
var dbCmd = CreateCommand(dbConn);
110110

111111
try
112112
{
113-
return filter(dbCmd)
114-
.ContinueWith(t =>
115-
{
116-
if (t.IsFaulted)
117-
{
118-
var ex = t.Exception.UnwrapIfSingleException();
119-
OrmLiteConfig.ExceptionFilter?.Invoke(dbCmd, ex);
120-
DisposeCommand(dbCmd, dbConn);
121-
throw ex;
122-
}
123-
124-
DisposeCommand(dbCmd, dbConn);
125-
return t.Result;
126-
});
113+
return await filter(dbCmd);
127114
}
128-
catch
115+
catch (Exception ex)
116+
{
117+
var useEx = ex.UnwrapIfSingleException();
118+
OrmLiteConfig.ExceptionFilter?.Invoke(dbCmd, useEx);
119+
throw useEx;
120+
}
121+
finally
129122
{
130123
DisposeCommand(dbCmd, dbConn);
131-
throw;
132124
}
133125
}
134126

135-
public virtual Task<IDbCommand> Exec(IDbConnection dbConn, Func<IDbCommand, Task<IDbCommand>> filter)
127+
public virtual async Task<IDbCommand> Exec(IDbConnection dbConn, Func<IDbCommand, Task<IDbCommand>> filter)
136128
{
137129
var dbCmd = CreateCommand(dbConn);
138-
139-
return filter(dbCmd).Then(t => t);
130+
return await filter(dbCmd);
140131
}
141132

142-
public virtual Task Exec(IDbConnection dbConn, Func<IDbCommand, Task> filter)
133+
public virtual async Task Exec(IDbConnection dbConn, Func<IDbCommand, Task> filter)
143134
{
144135
var dbCmd = CreateCommand(dbConn);
145136

146-
return filter(dbCmd)
147-
.Then(t =>
148-
{
149-
if (t.IsFaulted)
150-
{
151-
var ex = t.Exception.UnwrapIfSingleException();
152-
OrmLiteConfig.ExceptionFilter?.Invoke(dbCmd, ex);
153-
DisposeCommand(dbCmd, dbConn);
154-
throw ex;
155-
}
156-
157-
DisposeCommand(dbCmd, dbConn);
158-
return t;
159-
});
137+
try
138+
{
139+
await filter(dbCmd);
140+
}
141+
catch (Exception ex)
142+
{
143+
var useEx = ex.UnwrapIfSingleException();
144+
OrmLiteConfig.ExceptionFilter?.Invoke(dbCmd, useEx);
145+
throw useEx;
146+
}
147+
finally
148+
{
149+
DisposeCommand(dbCmd, dbConn);
150+
}
160151
}
161152

162153
public virtual IEnumerable<T> ExecLazy<T>(IDbConnection dbConn, Func<IDbCommand, IEnumerable<T>> filter)

src/ServiceStack.OrmLite/OrmLiteReadExpressionsApi.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Data;
55
using System.Linq;
66
using System.Linq.Expressions;
7+
using System.Threading;
78
using System.Threading.Tasks;
89
using ServiceStack.Text;
910

@@ -178,6 +179,16 @@ public static IDbTransaction OpenTransaction(this IDbConnection dbConn)
178179
return new OrmLiteTransaction(dbConn, dbConn.BeginTransaction());
179180
}
180181

182+
/// <summary>
183+
/// Returns a new transaction if not yet exists, otherwise null
184+
/// </summary>
185+
public static IDbTransaction OpenTransactionIfNotExists(this IDbConnection dbConn)
186+
{
187+
return !dbConn.InTransaction()
188+
? new OrmLiteTransaction(dbConn, dbConn.BeginTransaction())
189+
: null;
190+
}
191+
181192
/// <summary>
182193
/// Open a Transaction in OrmLite
183194
/// </summary>
@@ -186,6 +197,16 @@ public static IDbTransaction OpenTransaction(this IDbConnection dbConn, Isolatio
186197
return new OrmLiteTransaction(dbConn, dbConn.BeginTransaction(isolationLevel));
187198
}
188199

200+
/// <summary>
201+
/// Returns a new transaction if not yet exists, otherwise null
202+
/// </summary>
203+
public static IDbTransaction OpenTransactionIfNotExists(this IDbConnection dbConn, IsolationLevel isolationLevel)
204+
{
205+
return !dbConn.InTransaction()
206+
? new OrmLiteTransaction(dbConn, dbConn.BeginTransaction(isolationLevel))
207+
: null;
208+
}
209+
189210
/// <summary>
190211
/// Create a managed OrmLite IDbCommand
191212
/// </summary>
@@ -435,5 +456,8 @@ public static List<Into> LoadSelect<Into, From>(this IDbConnection dbConn, SqlEx
435456
/// Get Table Column Schemas for result-set return from specified sql
436457
/// </summary>
437458
public static ColumnSchema[] GetTableColumns(this IDbConnection dbConn, string sql) => dbConn.Exec(dbCmd => dbCmd.GetTableColumns(sql));
459+
460+
public static void EnableForeignKeysCheck(this IDbConnection dbConn) => dbConn.Exec(dbConn.GetDialectProvider().EnableForeignKeysCheck);
461+
public static void DisableForeignKeysCheck(this IDbConnection dbConn) => dbConn.Exec(dbConn.GetDialectProvider().DisableForeignKeysCheck);
438462
}
439463
}

src/ServiceStack.OrmLite/OrmLiteReadExpressionsApiAsync.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ public static Task<ColumnSchema[]> GetTableColumnsAsync(this IDbConnection dbCon
240240
/// </summary>
241241
public static Task<ColumnSchema[]> GetTableColumnsAsync(this IDbConnection dbConn, string sql, CancellationToken token=default) =>
242242
dbConn.Exec(dbCmd => dbCmd.GetTableColumnsAsync(sql, token));
243+
244+
public static Task EnableForeignKeysCheckAsync(this IDbConnection dbConn, CancellationToken token=default) =>
245+
dbConn.Exec(dbCmd => dbConn.GetDialectProvider().EnableForeignKeysCheckAsync(dbCmd, token));
246+
public static Task DisableForeignKeysCheckAsync(this IDbConnection dbConn, CancellationToken token=default) =>
247+
dbConn.Exec(dbCmd => dbConn.GetDialectProvider().DisableForeignKeysCheckAsync(dbCmd, token));
243248
}
244249

245250
}

0 commit comments

Comments
 (0)