Skip to content

Commit

Permalink
Add Async overload.
Browse files Browse the repository at this point in the history
  • Loading branch information
NimaAra committed Jul 27, 2019
1 parent f5d6eb3 commit a6215de
Show file tree
Hide file tree
Showing 6 changed files with 127 additions and 34 deletions.
73 changes: 68 additions & 5 deletions Easy.Storage.Common/Extensions/DbConnectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,19 +43,49 @@ public static IDBContext<T> GetDBContext<T>(
/// Executes the given <paramref name="sql"/>.
/// </summary>
/// <returns>The number of rows affected</returns>
public static int Execute(
this IDbConnection connection,
string sql,
object param = null,
IDbTransaction transaction = null,
int? commandTimeout = null,
CommandType? commandType = null,
CancellationToken cToken = default)
=> connection.Execute(new CommandDefinition(sql, param, transaction, commandTimeout, commandType, CommandFlags.None, cToken));

/// <summary>
/// Asynchronously Executes the given <paramref name="sql"/>.
/// </summary>
/// <returns>The number of rows affected</returns>
public static Task<int> ExecuteAsync(
this IDbConnection connection,
string sql,
object param = null,
IDbTransaction transaction = null,
int? commandTimeout = null,
CommandType? commandType = null,
CancellationToken cToken = default(CancellationToken))
=> connection.ExecuteAsync(new CommandDefinition(sql, param, transaction, commandTimeout, commandType, CommandFlags.None, cToken));
CancellationToken cToken = default)
=> connection.ExecuteAsync(
new CommandDefinition(sql, param, transaction, commandTimeout, commandType, CommandFlags.None, cToken));

/// <summary>
/// Executes the given <paramref name="sql"/> and returns the result of the query.
/// </summary>
public static IEnumerable<TReturn> Query<TReturn>(
this IDbConnection connection,
string sql,
object param = null,
IDbTransaction transaction = null,
int? commandTimeout = null,
CommandType? commandType = null,
bool buffered = true,
CancellationToken cToken = default)
=> connection.Query<TReturn>(
new CommandDefinition(sql, param, transaction, commandTimeout, commandType, buffered ? CommandFlags.Buffered : CommandFlags.None, cToken));

/// <summary>
/// Asynchronously Executes the given <paramref name="sql"/> and returns the result of the query.
/// </summary>
public static Task<IEnumerable<TReturn>> QueryAsync<TReturn>(
this IDbConnection connection,
string sql,
Expand All @@ -64,20 +94,33 @@ public static Task<IEnumerable<TReturn>> QueryAsync<TReturn>(
int? commandTimeout = null,
CommandType? commandType = null,
bool buffered = true,
CancellationToken cToken = default(CancellationToken))
CancellationToken cToken = default)
=> connection.QueryAsync<TReturn>(new CommandDefinition(sql, param, transaction, commandTimeout, commandType, buffered ? CommandFlags.Buffered : CommandFlags.None, cToken));

/// <summary>
/// Executes the given <paramref name="sql"/> that returns a single value.
/// </summary>
public static TReturn ExecuteScalar<TReturn>(
this IDbConnection connection,
string sql,
object param = null,
IDbTransaction transaction = null,
int? commandTimeout = null,
CommandType? commandType = null,
CancellationToken cToken = default)
=> connection.ExecuteScalar<TReturn>(new CommandDefinition(sql, param, transaction, commandTimeout, commandType, CommandFlags.None, cToken));

/// <summary>
/// Asynchronously Executes the given <paramref name="sql"/> that returns a single value.
/// </summary>
public static Task<TReturn> ExecuteScalarAsync<TReturn>(
this IDbConnection connection,
string sql,
object param = null,
IDbTransaction transaction = null,
int? commandTimeout = null,
CommandType? commandType = null,
CancellationToken cToken = default(CancellationToken))
CancellationToken cToken = default)
=> connection.ExecuteScalarAsync<TReturn>(new CommandDefinition(sql, param, transaction, commandTimeout, commandType, CommandFlags.None, cToken));

/// <summary>
Expand All @@ -86,6 +129,26 @@ public static Task<TReturn> ExecuteScalarAsync<TReturn>(
/// This method is not supported by <c>Oracle</c> as per: <see href="http://stackoverflow.com/a/6338193"/>.
/// </remarks>
/// </summary>
public static Reader QueryMultiple(
this IDbConnection connection,
string sql,
object param = null,
IDbTransaction transaction = null,
int? commandTimeout = null,
CommandType? commandType = null,
bool buffered = true,
CancellationToken cToken = default)
=> new Reader(
connection.QueryMultiple(
new CommandDefinition(sql, param, transaction, commandTimeout, commandType, buffered ? CommandFlags.Buffered : CommandFlags.None, cToken)
));

/// <summary>
/// Asynchronously Execute a command that returns multiple result sets, and access each in turn.
/// <remarks>
/// This method is not supported by <c>Oracle</c> as per: <see href="http://stackoverflow.com/a/6338193"/>.
/// </remarks>
/// </summary>
public static async Task<Reader> QueryMultipleAsync(
this IDbConnection connection,
string sql,
Expand All @@ -94,7 +157,7 @@ public static async Task<Reader> QueryMultipleAsync(
int? commandTimeout = null,
CommandType? commandType = null,
bool buffered = true,
CancellationToken cToken = default(CancellationToken))
CancellationToken cToken = default)
=> new Reader(
await connection.QueryMultipleAsync(
new CommandDefinition(sql, param, transaction, commandTimeout, commandType, buffered ? CommandFlags.Buffered : CommandFlags.None, cToken)
Expand Down
14 changes: 12 additions & 2 deletions Easy.Storage.SQLite/Connections/SqliteAttachedConnection.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Data.SQLite;
using System.IO;
using System.Threading.Tasks;
using Easy.Common;
using Easy.Storage.Common.Extensions;

Expand Down Expand Up @@ -46,10 +47,19 @@ public SQLiteAttachedConnection(IReadOnlyDictionary<string, FileInfo> dbFiles)
/// <summary>
/// Opens the connection and runs the command to attach the <see cref="FilesToAttach"/>.
/// </summary>
public override async void Open()
public override void Open()
{
Connection.Open();
await Connection.ExecuteAsync(_attachCommands);
Connection.Execute(_attachCommands);
}

/// <summary>
/// Opens the connection and runs the command to attach the <see cref="FilesToAttach"/>.
/// </summary>
public override Task OpenAsync()
{
Connection.Open();
return Connection.ExecuteAsync(_attachCommands);
}

/// <summary>
Expand Down
62 changes: 41 additions & 21 deletions Easy.Storage.SQLite/Connections/SqliteConnectionBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using System.Data;
using System.Data.Common;
using System.Data.SQLite;
using System.Threading.Tasks;
using Easy.Common;
using Easy.Common.Extensions;
using Easy.Storage.SQLite.Functions;
Expand All @@ -13,6 +14,8 @@
/// </summary>
public abstract class SQLiteConnectionBase : DbConnection, IDisposable
{
private const string INTEROP_DLL = "SQLite.Interop.dll";

/// <summary>
/// The underlying <c>SQLite</c> connection.
/// </summary>
Expand Down Expand Up @@ -116,6 +119,18 @@ public override void Open()
if (Connection.State == ConnectionState.Open) { return; }

Connection.Open();
EnableDefaultExtensions();
}

/// <summary>
/// Asynchronously Opens the connection using the parameters found in the <see cref="ConnectionString"/>.
/// </summary>
public async new virtual Task OpenAsync()
{
if (Connection.State == ConnectionState.Open) { return; }

await Connection.OpenAsync();
EnableDefaultExtensions();
}

/// <summary>
Expand All @@ -127,6 +142,15 @@ public DbConnection OpenAndReturn()
return this;
}

/// <summary>
/// Asynchronously Opens and returns the connection using the parameters found in the <see cref="ConnectionString"/>.
/// </summary>
public async Task<DbConnection> OpenAndReturnAsync()
{
await OpenAsync();
return this;
}

/// <summary>
/// Binds the given <paramref name="function"/> to the <paramref see="connection"/>.
/// </summary>
Expand All @@ -145,16 +169,6 @@ public void BindFunction(SQLiteFunctionBase function)
Connection.BindFunction(funcAttr, function);
}

/// <summary>
/// Enables <c>Full Text Search</c> support.
/// </summary>
public void EnableFTS5() => LoadExtension("SQLite.Interop.dll", "sqlite3_fts5_init");

/// <summary>
/// Enables <c>JSON</c> support.
/// </summary>
public void EnableJSON() => LoadExtension("SQLite.Interop.dll", "sqlite3_json_init");

/// <summary>
/// Loads a SQLite extension library from the named dynamic link library file.
/// </summary>
Expand All @@ -165,21 +179,27 @@ public void BindFunction(SQLiteFunctionBase function)
/// The name of the exported function used to initialize the extension.
/// If null, the default <c>sqlite3_extension_init</c> will be used.
/// </param>
public void LoadExtension(string fileName, string procName)
{
try
{
Connection.Open();
Connection.LoadExtension(fileName, procName);
} finally
{
Connection.Close();
}
}
public void LoadExtension(string fileName, string procName) => Connection.LoadExtension(fileName, procName);

/// <summary>
/// Disposes and finalizes the connection, if applicable.
/// </summary>
public new abstract void Dispose();

/// <summary>
/// Enables <c>Full Text Search</c> support.
/// </summary>
private void EnableFTS5() => LoadExtension(INTEROP_DLL, "sqlite3_fts5_init");

/// <summary>
/// Enables <c>JSON</c> support.
/// </summary>
private void EnableJSON() => LoadExtension(INTEROP_DLL, "sqlite3_json_init");

private void EnableDefaultExtensions()
{
EnableFTS5();
EnableJSON();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public async Task When_creating_connection()
conn.ConnectionTimeout.ShouldBe(15);
conn.DataSource.ShouldBeNull();
conn.Database.ShouldBe("main");
conn.ServerVersion.ShouldBe("3.27.2");
conn.ServerVersion.ShouldBe("3.28.0");
conn.State.ShouldBe(ConnectionState.Closed);

var attachedDbs = await conn.GetAttachedDatabases();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public void When_creating_connection()
conn.ConnectionTimeout.ShouldBe(15);
conn.DataSource.ShouldBeNull();
conn.Database.ShouldBe("main");
conn.ServerVersion.ShouldBe("3.27.2");
conn.ServerVersion.ShouldBe("3.28.0");
conn.State.ShouldBe(ConnectionState.Closed);
}
}
Expand All @@ -36,7 +36,7 @@ public void When_creating_connection_with_valid_connection_string()
conn.ConnectionTimeout.ShouldBe(15);
conn.DataSource.ShouldBeNull();
conn.Database.ShouldBe("main");
conn.ServerVersion.ShouldBe("3.27.2");
conn.ServerVersion.ShouldBe("3.28.0");
conn.State.ShouldBe(ConnectionState.Closed);
}
}
Expand All @@ -51,7 +51,7 @@ public void When_creating_connection_with_valid_connection_string_with_parameter
conn.ConnectionTimeout.ShouldBe(15);
conn.DataSource.ShouldBeNull();
conn.Database.ShouldBe("main");
conn.ServerVersion.ShouldBe("3.27.2");
conn.ServerVersion.ShouldBe("3.28.0");
conn.State.ShouldBe(ConnectionState.Closed);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public void When_creating_connection()
conn.ConnectionTimeout.ShouldBe(15);
conn.DataSource.ShouldBeNull();
conn.Database.ShouldBe("main");
conn.ServerVersion.ShouldBe("3.27.2");
conn.ServerVersion.ShouldBe("3.28.0");
conn.State.ShouldBe(ConnectionState.Closed);
}
}
Expand All @@ -34,7 +34,7 @@ public void When_creating_connection_with_valid_connection_string()
conn.ConnectionTimeout.ShouldBe(15);
conn.DataSource.ShouldBeNull();
conn.Database.ShouldBe("main");
conn.ServerVersion.ShouldBe("3.27.2");
conn.ServerVersion.ShouldBe("3.28.0");
conn.State.ShouldBe(ConnectionState.Closed);
}
}
Expand Down

0 comments on commit a6215de

Please sign in to comment.