Fix create database operations and multi statement splitting with parameters (#97)

* Fix automatically assigned file extensions when creating databases.

* Fix parser to correctly return state indices of sub commands. This is a fix for commands containing more than one actual SQL command in its command text, when those multiple actual SQL commands are using parameters.
pull/101/head
Laurents Meyer 5 years ago committed by GitHub
parent 163cf317f4
commit fedc4cc226
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -18,37 +18,7 @@ namespace EntityFrameworkCore.Jet.Data
} }
public IReadOnlyList<int> GetStateIndices(char state, int start = 0, int length = -1) public IReadOnlyList<int> GetStateIndices(char state, int start = 0, int length = -1)
{ => GetStateIndices(new[] {state}, start, length);
if (start < 0 ||
start >= States.Length)
{
throw new ArgumentOutOfRangeException(nameof(start));
}
if (length < 0 ||
length > 0 && start + length > States.Length)
{
length = States.Length - start;
}
var stateIndices = new List<int>();
char? lastState = null;
for (var i = start; i < length; i++)
{
var currentState = States[i];
if (currentState == state &&
currentState != lastState)
{
stateIndices.Add(i);
}
lastState = currentState;
}
return stateIndices.AsReadOnly();
}
public IReadOnlyList<int> GetStateIndices(char[] states, int start = 0, int length = -1) public IReadOnlyList<int> GetStateIndices(char[] states, int start = 0, int length = -1)
{ {
@ -77,7 +47,7 @@ namespace EntityFrameworkCore.Jet.Data
var stateIndices = new List<int>(); var stateIndices = new List<int>();
char? lastState = null; char? lastState = null;
for (var i = start; i < length; i++) for (var i = start; i < start + length; i++)
{ {
var currentState = States[i]; var currentState = States[i];

@ -1,10 +1,12 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.Design;
using System.Data; using System.Data;
using System.Data.Common; using System.Data.Common;
using EntityFrameworkCore.Jet.Data.JetStoreSchemaDefinition; using EntityFrameworkCore.Jet.Data.JetStoreSchemaDefinition;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Microsoft.Win32; using Microsoft.Win32;
@ -382,7 +384,7 @@ namespace EntityFrameworkCore.Jet.Data
} }
} }
connectionString = ExpandDatabaseFilePath(connectionString); connectionString = ExpandDatabaseFilePath(connectionString, DataAccessProviderFactory);
try try
{ {
@ -561,11 +563,17 @@ namespace EntityFrameworkCore.Jet.Data
} }
public static string GetConnectionString(string fileNameOrConnectionString, DbProviderFactory dataAccessProviderFactory) public static string GetConnectionString(string fileNameOrConnectionString, DbProviderFactory dataAccessProviderFactory)
=> GetConnectionString(fileNameOrConnectionString, GetDataAccessProviderType(dataAccessProviderFactory)); => GetConnectionString(fileNameOrConnectionString, GetDataAccessProviderType(dataAccessProviderFactory), dataAccessProviderFactory);
public static string GetConnectionString(string fileNameOrConnectionString, DataAccessProviderType dataAccessProviderType) public static string GetConnectionString(string fileNameOrConnectionString, DataAccessProviderType? dataAccessProviderType = null)
{
var providerType = dataAccessProviderType ?? JetConfiguration.DefaultDataAccessProviderType;
return GetConnectionString(fileNameOrConnectionString, providerType, JetFactory.Instance.GetDataAccessProviderFactory(providerType));
}
internal static string GetConnectionString(string fileNameOrConnectionString, DataAccessProviderType dataAccessProviderType, DbProviderFactory dataAccessProviderFactory)
=> IsConnectionString(fileNameOrConnectionString) => IsConnectionString(fileNameOrConnectionString)
? fileNameOrConnectionString ? ExpandDatabaseFilePath(fileNameOrConnectionString, dataAccessProviderFactory)
: GetConnectionString( : GetConnectionString(
GetMostRecentCompatibleProviders(dataAccessProviderType).First().Key, GetMostRecentCompatibleProviders(dataAccessProviderType).First().Key,
fileNameOrConnectionString, fileNameOrConnectionString,
@ -576,12 +584,12 @@ namespace EntityFrameworkCore.Jet.Data
public static string GetConnectionString(string provider, string fileName, DataAccessProviderType dataAccessProviderType) public static string GetConnectionString(string provider, string fileName, DataAccessProviderType dataAccessProviderType)
=> dataAccessProviderType == DataAccessProviderType.OleDb => dataAccessProviderType == DataAccessProviderType.OleDb
? $"Provider={provider};Data Source={fileName}" ? $"Provider={provider};Data Source={JetStoreDatabaseHandling.ExpandFileName(fileName)}"
: $"Driver={{{provider}}};DBQ={fileName}"; : $"Driver={{{provider}}};DBQ={JetStoreDatabaseHandling.ExpandFileName(fileName)}";
private string ExpandDatabaseFilePath(string connectionString) private static string ExpandDatabaseFilePath(string connectionString, DbProviderFactory dataAccessProviderFactory)
{ {
var connectionStringBuilder = JetFactory.InnerFactory.CreateConnectionStringBuilder(); var connectionStringBuilder = dataAccessProviderFactory.CreateConnectionStringBuilder();
connectionStringBuilder.ConnectionString = connectionString; connectionStringBuilder.ConnectionString = connectionString;
connectionStringBuilder.SetDataSource(JetStoreDatabaseHandling.ExpandFileName(connectionStringBuilder.GetDataSource())); connectionStringBuilder.SetDataSource(JetStoreDatabaseHandling.ExpandFileName(connectionStringBuilder.GetDataSource()));

@ -107,8 +107,11 @@ namespace EntityFrameworkCore.Jet.Storage.Internal
// var dataSource = _relationalConnection.DbConnection.DataSource; // var dataSource = _relationalConnection.DbConnection.DataSource;
var connection = (JetConnection) _relationalConnection.DbConnection; var connection = (JetConnection) _relationalConnection.DbConnection;
var fileNameOrConnectionString = connection.ConnectionString;
var connectionString = JetConnection.GetConnectionString(fileNameOrConnectionString, connection.DataAccessProviderFactory);
var csb = connection.JetFactory.CreateConnectionStringBuilder(); var csb = connection.JetFactory.CreateConnectionStringBuilder();
csb.ConnectionString = connection.ConnectionString; csb.ConnectionString = connectionString;
var dataSource = csb.GetDataSource(); var dataSource = csb.GetDataSource();
var databasePassword = csb.GetDatabasePassword(); var databasePassword = csb.GetDatabasePassword();

Loading…
Cancel
Save