Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

The outbox cannot be used with devArt dotConnect for Oracle #1419

Merged
merged 5 commits into from Mar 13, 2024
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Expand Up @@ -58,7 +58,7 @@ jobs:
creds: ${{ secrets.AZURE_ACI_CREDENTIALS }}
- name: Setup SQL Server
if: matrix.engine == 'SqlServer'
uses: Particular/install-sql-server-action@v1.0.0
uses: Particular/install-sql-server-action@v1.1.0
with:
connection-string-env-var: SQLServerConnectionString
catalog: nservicebus
Expand Down Expand Up @@ -150,7 +150,7 @@ jobs:
- name: Setup Oracle
id: setup-oracle
if: matrix.engine == 'Oracle'
uses: Particular/setup-oracle-action@v1.3.0
uses: Particular/setup-oracle-action@v1.4.0
with:
connection-string-name: OracleConnectionString
init-script: ./.github/workflows/scripts/setup-database-users-and-permissions.sql
Expand Down
15 changes: 9 additions & 6 deletions src/SqlPersistence/Config/SqlDialect_Oracle.cs
Expand Up @@ -13,7 +13,7 @@ public abstract partial class SqlDialect
/// </summary>
public partial class Oracle : SqlDialect
{
volatile PropertyInfo bindByName;
volatile PropertyInfo parametersByNameProperty;

internal override void SetJsonParameterValue(DbParameter parameter, object value)
{
Expand Down Expand Up @@ -42,16 +42,19 @@ internal override CommandWrapper CreateCommand(DbConnection connection)
{
var command = connection.CreateCommand();

if (bindByName == null)
if (parametersByNameProperty == null)
{
var type = command.GetType();
bindByName = type.GetProperty("BindByName");
if (bindByName == null)
parametersByNameProperty = type.GetProperty("BindByName") ??
// someone might be using DevArt Oracle provider which uses PassParametersByName
type.GetProperty("PassParametersByName");
if (parametersByNameProperty == null)
{
throw new Exception($"Could not extract field 'BindByName' from '{type.AssemblyQualifiedName}'.");
throw new Exception($"Could not extract property 'BindByName' nor 'PassParametersByName' from '{type.AssemblyQualifiedName}'. The property is required to make sure the parameters passed to the commands can be passed by name and do not depend on the order they are added to the command.");
}
}
bindByName.SetValue(command, true);

parametersByNameProperty.SetValue(command, true);

return new CommandWrapper(command, this);
}
Expand Down
9 changes: 7 additions & 2 deletions src/SqlPersistence/Extensions.cs
Expand Up @@ -61,16 +61,21 @@ public static void AddParameter(this DbCommand command, string name, Version val
public static async Task<bool> GetBoolAsync(this DbDataReader reader, int position)
{
var type = reader.GetFieldType(position);
// MySql stores bools as ints
// MySql stores bools as longs (ulong)
if (type == typeof(ulong))
{
return Convert.ToBoolean(await reader.GetFieldValueAsync<ulong>(position).ConfigureAwait(false));
}
// In Oracle we store bools as NUMBER(1,0) (short).
// In Oracle default driver store bools as NUMBER(1,0) (short).
if (type == typeof(short))
{
return Convert.ToBoolean(await reader.GetFieldValueAsync<short>(position).ConfigureAwait(false));
}
// or it might be stored as ints.
if (type == typeof(int))
{
return Convert.ToBoolean(await reader.GetFieldValueAsync<int>(position).ConfigureAwait(false));
}
return await reader.GetFieldValueAsync<bool>(position).ConfigureAwait(false);
}

Expand Down