Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/DbReader.Tests/DbReader.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
</PackageReference>
<PackageReference Include="moq" Version="4.20.72" />
<PackageReference Include="shouldly" Version="4.3.0" />
<PackageReference Include="System.Data.SQLite.Core" Version="1.0.115" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.4" />
<PackageReference Include="ILVerifier" Version="0.0.1" />
</ItemGroup>
<PropertyGroup>
<TargetFrameworks>net8.0</TargetFrameworks>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>

</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="**/*.sql" />
Expand All @@ -34,4 +34,6 @@
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>


</Project>
19 changes: 10 additions & 9 deletions src/DbReader.Tests/IntegrationTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@ namespace DbReader.Tests
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.SQLite;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DbReader;
using Extensions;
using Microsoft.Data.Sqlite;
using Shouldly;
using Xunit;

Expand Down Expand Up @@ -41,8 +40,7 @@ public IntegrationTests()
if (!File.Exists(dbFile))
{
Console.WriteLine("Hold your horses..creating database...");
SQLiteConnection.CreateFile(dbFile);
using (var connection = new SQLiteConnection("Data Source = " + dbFile))
using (var connection = new SqliteConnection("Data Source = " + dbFile + ";foreign keys=true;"))
{

connection.Open();
Expand All @@ -63,7 +61,7 @@ private string ReadScript()

private IDbConnection CreateConnection()
{
var connection = new SQLiteConnection(connectionString);
var connection = new SqliteConnection(connectionString);
connection.Open();
return connection;
}
Expand Down Expand Up @@ -241,7 +239,7 @@ public void ShouldReadCustomerByIdUsingDataParameter()
using (var connection = CreateConnection())
{
var customers = connection.Read<Customer>("SELECT * FROM Customers WHERE CustomerId = @CustomerId",
new { CustomerId = new SQLiteParameter("@CustomerId", "ALFKI") });
new { CustomerId = new SqliteParameter("@CustomerId", "ALFKI") });
customers.Count().ShouldBe(1);
}
}
Expand Down Expand Up @@ -317,8 +315,7 @@ public void ShouldInvokeCommandInitializerBeforeParsingQuery()
DbReaderOptions.CommandInitializer = null;
}


[OnlyOnIntelFactAttribute]
[Fact]
public void ShouldReadEmployeeHierarchy()
{
using (var connection = CreateConnection())
Expand Down Expand Up @@ -546,7 +543,11 @@ public void ShouldReadSimpleType()
[Fact]
public void ShouldReadSimpleTypeUsingValueConverter()
{
DbReaderOptions.WhenReading<CustomValueType>().Use((record, ordinal) => new CustomValueType(record.GetInt32(ordinal)));
DbReaderOptions.WhenReading<CustomValueType>().Use((record, ordinal) =>
{
record.ShouldBeOfType(typeof(SqliteDataReader));
return new CustomValueType(record.GetInt32(ordinal));
});

using (var connection = CreateConnection())
{
Expand Down
16 changes: 0 additions & 16 deletions src/DbReader.Tests/OnlyOnIntelAttribute.cs

This file was deleted.

Binary file added src/DbReader.Tests/SQLite119/SQLite.Interop.dll
Binary file not shown.
Binary file not shown.
Binary file added src/DbReader.Tests/SQLite119/libz.1.3.1.dylib
Binary file not shown.
1 change: 1 addition & 0 deletions src/DbReader.Tests/SQLite119/libz.1.dylib
1 change: 1 addition & 0 deletions src/DbReader.Tests/SQLite119/libz.dylib
1,177 changes: 573 additions & 604 deletions src/DbReader.Tests/db/northwind.sql

Large diffs are not rendered by default.

144 changes: 144 additions & 0 deletions src/DbReader/CommandWrappingDataReader.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Threading;
using System.Threading.Tasks;

namespace DbReader;
public class CommandWrappingDataReader(DbCommand command, DbDataReader reader) : DbDataReader

Check warning on line 9 in src/DbReader/CommandWrappingDataReader.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'CommandWrappingDataReader.CommandWrappingDataReader(DbCommand, DbDataReader)'

Check warning on line 9 in src/DbReader/CommandWrappingDataReader.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'CommandWrappingDataReader'

Check warning on line 9 in src/DbReader/CommandWrappingDataReader.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'CommandWrappingDataReader.CommandWrappingDataReader(DbCommand, DbDataReader)'

Check warning on line 9 in src/DbReader/CommandWrappingDataReader.cs

View workflow job for this annotation

GitHub Actions / build

Missing XML comment for publicly visible type or member 'CommandWrappingDataReader'
{

/// <summary>
/// Gets the inner <see cref="DbDataReader"/> that this reader wraps.
/// </summary>
public DbDataReader InnerReader => reader;


/// <inheritdoc />
public override void Close() => reader.Close();

/// <inheritdoc />
public override async Task<bool> ReadAsync(CancellationToken cancellationToken) =>
await reader.ReadAsync(cancellationToken);

/// <inheritdoc />
public override bool Read() => reader.Read();

/// <inheritdoc />
public override int FieldCount => reader.FieldCount;

/// <inheritdoc />
public override object this[int ordinal] => reader[ordinal];

/// <inheritdoc />
public override object this[string name] => reader[name];

/// <inheritdoc />
public override bool HasRows => reader.HasRows;

/// <inheritdoc />
public override bool IsClosed => reader.IsClosed;

/// <inheritdoc />
public override int RecordsAffected => reader.RecordsAffected;

/// <inheritdoc />
public override int Depth => reader.Depth;

/// <inheritdoc />
public override bool GetBoolean(int ordinal) => reader.GetBoolean(ordinal);

/// <inheritdoc />
public override byte GetByte(int ordinal) => reader.GetByte(ordinal);

/// <inheritdoc />
public override char GetChar(int ordinal) => reader.GetChar(ordinal);

/// <inheritdoc />
public override DateTime GetDateTime(int ordinal) => reader.GetDateTime(ordinal);

/// <inheritdoc />
public override decimal GetDecimal(int ordinal) => reader.GetDecimal(ordinal);

/// <inheritdoc />
public override double GetDouble(int ordinal) => reader.GetDouble(ordinal);

/// <inheritdoc />
public override float GetFloat(int ordinal) => reader.GetFloat(ordinal);

/// <inheritdoc />
public override Guid GetGuid(int ordinal) => reader.GetGuid(ordinal);

/// <inheritdoc />
public override short GetInt16(int ordinal) => reader.GetInt16(ordinal);

/// <inheritdoc />
public override int GetInt32(int ordinal) => reader.GetInt32(ordinal);

/// <inheritdoc />
public override long GetInt64(int ordinal) => reader.GetInt64(ordinal);

/// <inheritdoc />
public override string GetString(int ordinal) => reader.GetString(ordinal);

/// <inheritdoc />
public override object GetValue(int ordinal) => reader.GetValue(ordinal);

/// <inheritdoc />
public override bool IsDBNull(int ordinal) => reader.IsDBNull(ordinal);

/// <inheritdoc />
public override int GetValues(object[] values) => reader.GetValues(values);

/// <inheritdoc />
public override string GetName(int ordinal) => reader.GetName(ordinal);

/// <inheritdoc />
public override string GetDataTypeName(int ordinal) => reader.GetDataTypeName(ordinal);

/// <inheritdoc />
public override Type GetFieldType(int ordinal) => reader.GetFieldType(ordinal);

/// <inheritdoc />
public override int GetOrdinal(string name) => reader.GetOrdinal(name);

/// <inheritdoc />
public override DataTable GetSchemaTable() => reader.GetSchemaTable();

/// <inheritdoc />
public override bool NextResult() => reader.NextResult();

/// <inheritdoc />
public override Task<bool> NextResultAsync(CancellationToken cancellationToken) =>
reader.NextResultAsync(cancellationToken);

/// <inheritdoc />
public override T GetFieldValue<T>(int ordinal) => reader.GetFieldValue<T>(ordinal);

/// <inheritdoc />
public override Task<T> GetFieldValueAsync<T>(int ordinal, CancellationToken cancellationToken) =>
reader.GetFieldValueAsync<T>(ordinal, cancellationToken);

/// <inheritdoc />
public override IEnumerator<object> GetEnumerator() => ((IEnumerable<object>)reader).GetEnumerator();

/// <inheritdoc />
protected override void Dispose(bool disposing)
{
if (disposing)
{
reader.Dispose();
command.Dispose();
}
base.Dispose(disposing);
}

/// <inheritdoc />
public override long GetBytes(int ordinal, long dataOffset, byte[] buffer, int bufferOffset, int length)
=> reader.GetBytes(ordinal, dataOffset, buffer, bufferOffset, length);

/// <inheritdoc />
public override long GetChars(int ordinal, long dataOffset, char[] buffer, int bufferOffset, int length)
=> reader.GetChars(ordinal, dataOffset, buffer, bufferOffset, length);
}
17 changes: 8 additions & 9 deletions src/DbReader/DbConnectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,11 @@ public static async Task<IEnumerable<T>> ReadAsync<T>(
/// <returns><see cref="IDataReader"/></returns>
public static IDataReader ExecuteReader(this IDbConnection dbConnection, string query, object arguments = null, Action<IDbCommand> configureCommand = default)
{
using (var command = CreateCommand(dbConnection, query, arguments, configureCommand))
{
return command.ExecuteReader();
}
// var command = CreateCommand(dbConnection, query, arguments, configureCommand);
// return command.ExecuteReader();
var command = CreateCommand(dbConnection, query, arguments, configureCommand);
return new CommandWrappingDataReader((DbCommand)command, (DbDataReader)command.ExecuteReader());

}

/// <summary>
Expand All @@ -130,10 +131,8 @@ public static async Task<IDataReader> ExecuteReaderAsync(this IDbConnection dbCo
/// <returns><see cref="IDataReader"/></returns>
public static async Task<IDataReader> ExecuteReaderAsync(this IDbConnection dbConnection, CancellationToken cancellationToken, string query, object arguments = null, Action<IDbCommand> configureCommand = null)
{
using (var command = CreateCommand(dbConnection, query, arguments, configureCommand))
{
return await ((DbCommand)command).ExecuteReaderAsync(cancellationToken).ConfigureAwait(false);
}
var command = CreateCommand(dbConnection, query, arguments, configureCommand);
return new CommandWrappingDataReader((DbCommand)command, await ((DbCommand)command).ExecuteReaderAsync(cancellationToken));
}

/// <summary>
Expand Down Expand Up @@ -193,7 +192,7 @@ public static async Task<int> ExecuteAsync(this IDbConnection dbConnection, stri
{
return await dbConnection.ExecuteAsync(CancellationToken.None, query, arguments, configureCommand).ConfigureAwait(false);
}


/// <summary>
/// Executes the given <paramref name="query"/> asynchronously and returns the number of rows affected.
Expand Down
9 changes: 8 additions & 1 deletion src/DbReader/ValueConverter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,14 @@ internal static T GetDefaultValue<T>()
/// <returns>An instance of <typeparamref name="T"/>.</returns>
public static T Convert<T>(IDataRecord dataRecord, int ordinal)
{
return ((Func<IDataRecord, int, T>)ReadDelegates[typeof(T)])(dataRecord, ordinal);
if (dataRecord is CommandWrappingDataReader reader)
{
return ((Func<IDataRecord, int, T>)ReadDelegates[typeof(T)])(reader.InnerReader, ordinal);
}
else
{
return ((Func<IDataRecord, int, T>)ReadDelegates[typeof(T)])(dataRecord, ordinal);
}
}

/// <summary>
Expand Down
Loading