Skip to content

Commit

Permalink
Merge pull request #108 from richardhopton/master
Browse files Browse the repository at this point in the history
Fix for issues 105, 106 & 109
  • Loading branch information
markrendle committed Nov 3, 2011
2 parents 030dcb9 + 7272a9e commit d738af1
Show file tree
Hide file tree
Showing 18 changed files with 100 additions and 30 deletions.
2 changes: 1 addition & 1 deletion Simple.Data.Ado/AdoAdapter.IAdapterWithFunctions.cs
Expand Up @@ -18,7 +18,7 @@ public bool IsValidFunction(string functionName)

public IEnumerable<ResultSet> Execute(string functionName, IDictionary<string, object> parameters)
{
var executor = _executors.GetOrAdd(functionName, f => _connectionProvider.GetProcedureExecutor(this, ObjectName.Parse(f)));
var executor = _executors.GetOrAdd(functionName, f => _connectionProvider.GetProcedureExecutor(this, _schema.BuildObjectName(f)));
return executor.Execute(parameters);
}
}
Expand Down
12 changes: 7 additions & 5 deletions Simple.Data.Ado/AdoAdapterFinder.cs
Expand Up @@ -5,6 +5,7 @@
using System.Data.Common;
using System.Linq;
using System.Text;
using Simple.Data.Ado.Schema;

namespace Simple.Data.Ado
{
Expand All @@ -15,6 +16,7 @@ class AdoAdapterFinder
private readonly AdoAdapter _adapter;
private readonly IDbTransaction _transaction;
private readonly IDbConnection _connection;
private readonly DatabaseSchema _schema;

public AdoAdapterFinder(AdoAdapter adapter) : this(adapter, null)
{
Expand All @@ -34,7 +36,7 @@ public AdoAdapterFinder(AdoAdapter adapter, IDbTransaction transaction)

public IDictionary<string, object> FindOne(string tableName, SimpleExpression criteria)
{
if (criteria == null) return FindAll(ObjectName.Parse(tableName)).FirstOrDefault();
if (criteria == null) return FindAll(_adapter.GetSchema().BuildObjectName(tableName)).FirstOrDefault();
var commandTemplate = GetCommandTemplate(tableName, criteria);
return ExecuteSingletonQuery(commandTemplate, criteria.GetValues());
}
Expand All @@ -43,15 +45,15 @@ public AdoAdapterFinder(AdoAdapter adapter, IDbTransaction transaction)
{
if (criteria == null)
{
return _ => FindAll(ObjectName.Parse(tableName)).FirstOrDefault();
return _ => FindAll(_adapter.GetSchema().BuildObjectName(tableName)).FirstOrDefault();
}
var commandTemplate = GetCommandTemplate(tableName, criteria);
return args => ExecuteSingletonQuery(commandTemplate, args);
}

public IEnumerable<IDictionary<string, object>> Find(string tableName, SimpleExpression criteria)
{
if (criteria == null) return FindAll(ObjectName.Parse(tableName));
if (criteria == null) return FindAll(_adapter.GetSchema().BuildObjectName(tableName));
var commandTemplate = GetCommandTemplate(tableName, criteria);
return ExecuteQuery(commandTemplate, criteria.GetValues());
}
Expand All @@ -65,8 +67,8 @@ private CommandTemplate GetCommandTemplate(string tableName, SimpleExpression cr
return tableCommandCache.GetOrAdd(hash,
_ =>
new FindHelper(_adapter.GetSchema())
.GetFindByCommand(ObjectName.Parse(tableName), criteria)
.GetCommandTemplate(_adapter.GetSchema().FindTable(ObjectName.Parse(tableName))));
.GetFindByCommand(_adapter.GetSchema().BuildObjectName(tableName), criteria)
.GetCommandTemplate(_adapter.GetSchema().FindTable(_adapter.GetSchema().BuildObjectName(tableName))));
}

private IEnumerable<IDictionary<string, object>> FindAll(ObjectName tableName)
Expand Down
15 changes: 13 additions & 2 deletions Simple.Data.Ado/CommandBuilder.cs
Expand Up @@ -255,9 +255,20 @@ public static void SetBetweenInCommandText(IDbCommand command, string name)

private static IDbDataParameter CreateSingleParameter(IDbParameterFactory parameterFactory, object value, ParameterTemplate template)
{
if (template.Column != null) return CreateSingleParameter(parameterFactory, value, template.Name, template.Column);
if (template.Column != null)
{
return CreateSingleParameter(parameterFactory, value, template.Name, template.Column);
}

var parameter = parameterFactory.CreateParameter(template.Name, template.DbType, template.MaxLength);
var parameter = default(IDbDataParameter);
if (template.Type == ParameterType.NameOnly)
{
parameter = parameterFactory.CreateParameter(template.Name);
}
else
{
parameter = parameterFactory.CreateParameter(template.Name, template.DbType, template.MaxLength);
}
parameter.Value = CommandHelper.FixObjectType(value);
return parameter;
}
Expand Down
20 changes: 15 additions & 5 deletions Simple.Data.Ado/CommandTemplate.cs
Expand Up @@ -120,11 +120,21 @@ private static void RewriteSqlEqualityToInClause(IDbCommand command, ParameterTe
private IDbDataParameter CreateParameter(IDbCommand command, ParameterTemplate parameterTemplate, object value, string suffix = "")
{
var factory = _createGetParameterFactoryFunc(command);
var parameter = parameterTemplate.Column != null
? factory.CreateParameter(parameterTemplate.Name + suffix,
parameterTemplate.Column)
: factory.CreateParameter(parameterTemplate.Name, parameterTemplate.DbType,
parameterTemplate.MaxLength);
var parameter = default(IDbDataParameter);
if(parameterTemplate.Column != null)
{
parameter = factory.CreateParameter(parameterTemplate.Name + suffix,
parameterTemplate.Column);
}
else if (parameterTemplate.Type == ParameterType.NameOnly)
{
parameter = factory.CreateParameter(parameterTemplate.Name);
}
else
{
parameter = factory.CreateParameter(parameterTemplate.Name, parameterTemplate.DbType,
parameterTemplate.MaxLength);
}
parameter.Value = FixObjectType(value);
return parameter;
}
Expand Down
8 changes: 8 additions & 0 deletions Simple.Data.Ado/GenericDbParameterFactory.cs
Expand Up @@ -14,6 +14,14 @@ public GenericDbParameterFactory(IDbCommand command)
_command = command;
}

public IDbDataParameter CreateParameter(string name)
{
if (name == null) throw new ArgumentNullException("name");
var parameter = _command.CreateParameter();
parameter.ParameterName = name;
return parameter;
}

public IDbDataParameter CreateParameter(string name, Column column)
{
if (name == null) throw new ArgumentNullException("name");
Expand Down
1 change: 1 addition & 0 deletions Simple.Data.Ado/IDbParameterFactory.cs
Expand Up @@ -6,6 +6,7 @@

public interface IDbParameterFactory
{
IDbDataParameter CreateParameter(string name);
IDbDataParameter CreateParameter(string name, Column column);
IDbDataParameter CreateParameter(string name, DbType dbType, int maxLength);
}
Expand Down
2 changes: 1 addition & 1 deletion Simple.Data.Ado/Joiner.cs
Expand Up @@ -67,7 +67,7 @@ public IEnumerable<string> GetJoinClauses(IEnumerable<JoinClause> joins, IComman
{
var builder = new StringBuilder(JoinKeyword);
builder.AppendFormat(" JOIN {0}{1} ON ({2})",
_schema.FindTable(ObjectName.Parse(join.Table.ToString())).QualifiedName,
_schema.FindTable(_schema.BuildObjectName(join.Table.ToString())).QualifiedName,
string.IsNullOrWhiteSpace(join.Table.Alias) ? string.Empty : " " + _schema.QuoteObjectName(join.Table.Alias),
expressionFormatter.Format(join.JoinExpression));
yield return builder.ToString().Trim();
Expand Down
10 changes: 1 addition & 9 deletions Simple.Data.Ado/ObjectName.cs
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Simple.Data.Ado.Schema;

namespace Simple.Data.Ado
{
Expand All @@ -24,15 +25,6 @@ public ObjectName(string schema, string name)
_name = name;
}

public static ObjectName Parse(string text)
{
if (text == null) throw new ArgumentNullException("text");
if (!text.Contains('.')) return new ObjectName(Properties.Settings.Default.DefaultSchema ?? "dbo", text);
var schemaDotTable = text.Split('.');
if (schemaDotTable.Length != 2) throw new InvalidOperationException("Could not parse table name.");
return new ObjectName(schemaDotTable[0], schemaDotTable[1]);
}

public string Name
{
get { return _name; }
Expand Down
5 changes: 3 additions & 2 deletions Simple.Data.Ado/ParameterTemplate.cs
Expand Up @@ -27,7 +27,7 @@ public ParameterTemplate(string name, Column column)
_column = column;
if (column == null)
{
_type = ParameterType.Other;
_type = ParameterType.NameOnly;
return;
}
_type = ParameterType.Column;
Expand Down Expand Up @@ -116,6 +116,7 @@ enum ParameterType
{
Column,
FixedValue,
Other
Other,
NameOnly
}
}
3 changes: 2 additions & 1 deletion Simple.Data.Ado/ProcedureExecutor.cs
Expand Up @@ -74,7 +74,8 @@ public IEnumerable<ResultSet> ExecuteReader(IDbCommand command)
command.Connection.Open();
using (var reader = command.ExecuteReader())
{
if (reader.FieldCount > 0)
// Reader isn't always returned - added check to stop NullReferenceException
if ((reader != null) && (reader.FieldCount > 0))
{
return reader.ToMultipleDictionaries();
}
Expand Down
2 changes: 1 addition & 1 deletion Simple.Data.Ado/QueryBuilder.cs
Expand Up @@ -70,7 +70,7 @@ private void SetQueryContext(SimpleQuery query)
_havingCriteria = _query.Clauses.OfType<HavingClause>().Aggregate(SimpleExpression.Empty,
(seed, having) => seed && having.Criteria);

_tableName = ObjectName.Parse(query.TableName.Split('.').Last());
_tableName = _schema.BuildObjectName(query.TableName.Split('.').Last());
_table = _schema.FindTable(_tableName);
_commandBuilder.SetText(GetSelectClause(_tableName));
}
Expand Down
16 changes: 15 additions & 1 deletion Simple.Data.Ado/Schema/DatabaseSchema.cs
Expand Up @@ -63,6 +63,11 @@ public Procedure FindProcedure(ObjectName procedureName)
return _lazyProcedures.Value.Find(procedureName);
}

private String GetDefaultSchema()
{
return _schemaProvider.GetDefaultSchema();
}

private TableCollection CreateTableCollection()
{
return new TableCollection(_schemaProvider.GetTables()
Expand Down Expand Up @@ -101,5 +106,14 @@ public static void ClearCache()
{
Instances.Clear();
}

public ObjectName BuildObjectName(String text)
{
if (text == null) throw new ArgumentNullException("text");
if (!text.Contains('.')) return new ObjectName(this.GetDefaultSchema(), text);
var schemaDotTable = text.Split('.');
if (schemaDotTable.Length != 2) throw new InvalidOperationException("Could not parse table name.");
return new ObjectName(schemaDotTable[0], schemaDotTable[1]);
}
}
}
}
1 change: 1 addition & 0 deletions Simple.Data.Ado/Schema/ISchemaProvider.cs
Expand Up @@ -13,5 +13,6 @@ public interface ISchemaProvider
IEnumerable<ForeignKey> GetForeignKeys(Table table);
string QuoteObjectName(string unquotedName);
string NameParameter(string baseName);
string GetDefaultSchema();
}
}
5 changes: 4 additions & 1 deletion Simple.Data.Mocking/Ado/MockSchemaProvider.cs
Expand Up @@ -154,6 +154,9 @@ public void Reset()
_tables.Clear();
}


public String GetDefaultSchema()
{
return "dbo";
}
}
}
5 changes: 5 additions & 0 deletions Simple.Data.SqlCe40/SqlCe40SchemaProvider.cs
Expand Up @@ -165,5 +165,10 @@ private DataTable SelectToDataTable(string sql)

return dataTable;
}

public String GetDefaultSchema()
{
return "dbo";
}
}
}
8 changes: 8 additions & 0 deletions Simple.Data.SqlCe40/SqlCeDbParameterFactory.cs
Expand Up @@ -16,6 +16,14 @@ public IDbDataParameter CreateParameter(string name, Column column)
return new SqlCeParameter(name, sqlCeColumn.SqlDbType, 0, column.ActualName);
}

public IDbDataParameter CreateParameter(string name)
{
return new SqlCeParameter
{
ParameterName = name
};
}

public IDbDataParameter CreateParameter(string name, DbType dbType, int maxLength)
{
IDbDataParameter parameter = new SqlCeParameter
Expand Down
10 changes: 9 additions & 1 deletion Simple.Data.SqlServer/SqlCeDbParameterFactory.cs
Expand Up @@ -9,9 +9,17 @@
[Export(typeof(IDbParameterFactory))]
public class SqlDbParameterFactory : IDbParameterFactory
{
public IDbDataParameter CreateParameter(string name)
{
return new SqlParameter
{
ParameterName = name
};
}

public IDbDataParameter CreateParameter(string name, Column column)
{
var sqlColumn = (SqlColumn) column;
var sqlColumn = (SqlColumn)column;
return new SqlParameter(name, sqlColumn.SqlDbType, column.MaxLength, column.ActualName);
}

Expand Down
5 changes: 5 additions & 0 deletions Simple.Data.SqlServer/SqlSchemaProvider.cs
Expand Up @@ -189,5 +189,10 @@ private static SqlDbType DbTypeFromInformationSchemaTypeName(string informationS
{
return DbTypeLookup.GetSqlDbType(informationSchemaTypeName);
}

public String GetDefaultSchema()
{
return "dbo";
}
}
}

0 comments on commit d738af1

Please sign in to comment.