This commit is contained in:
grzegorz.russek
2015-05-14 22:31:28 +00:00
parent 7a545224de
commit 8c10309946
22 changed files with 666 additions and 738 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -46,9 +46,9 @@ namespace DynamORM.Builders.Extensions
if (func == null) if (func == null)
throw new ArgumentNullException("Function cannot be null."); throw new ArgumentNullException("Function cannot be null.");
using (var parser = DynamicParser.Parse(func)) using (DynamicParser parser = DynamicParser.Parse(func))
{ {
var result = parser.Result; object result = parser.Result;
// If the expression result is string. // If the expression result is string.
if (result is string) if (result is string)
@@ -58,7 +58,7 @@ namespace DynamORM.Builders.Extensions
else if (result is DynamicParser.Node) else if (result is DynamicParser.Node)
{ {
// Or if it resolves to a dynamic node // Or if it resolves to a dynamic node
var node = (DynamicParser.Node)result; DynamicParser.Node node = (DynamicParser.Node)result;
string owner = null; string owner = null;
string main = null; string main = null;
@@ -89,7 +89,7 @@ namespace DynamORM.Builders.Extensions
{ {
if (owner == null && main == null) if (owner == null && main == null)
{ {
var invoke = (DynamicParser.Node.Invoke)node; DynamicParser.Node.Invoke invoke = (DynamicParser.Node.Invoke)node;
if (invoke.Arguments.Length == 1 && invoke.Arguments[0] is Type) if (invoke.Arguments.Length == 1 && invoke.Arguments[0] is Type)
return builder.Table((Type)invoke.Arguments[0]); return builder.Table((Type)invoke.Arguments[0]);
@@ -117,12 +117,12 @@ namespace DynamORM.Builders.Extensions
internal static T Table<T>(this T builder, string tableName, Dictionary<string, DynamicSchemaColumn> schema = null) where T : DynamicModifyBuilder internal static T Table<T>(this T builder, string tableName, Dictionary<string, DynamicSchemaColumn> schema = null) where T : DynamicModifyBuilder
{ {
var tuple = tableName.Validated("Table Name").SplitSomethingAndAlias(); Tuple<string, string> tuple = tableName.Validated("Table Name").SplitSomethingAndAlias();
if (!string.IsNullOrEmpty(tuple.Item2)) if (!string.IsNullOrEmpty(tuple.Item2))
throw new ArgumentException(string.Format("Can not use aliases in INSERT steatement. ({0})", tableName), "tableName"); throw new ArgumentException(string.Format("Can not use aliases in INSERT steatement. ({0})", tableName), "tableName");
var parts = tuple.Item1.Split('.'); string[] parts = tuple.Item1.Split('.');
if (parts.Length > 2) if (parts.Length > 2)
throw new ArgumentException(string.Format("Table name can consist only from name or owner and name. ({0})", tableName), "tableName"); throw new ArgumentException(string.Format("Table name can consist only from name or owner and name. ({0})", tableName), "tableName");
@@ -143,7 +143,7 @@ namespace DynamORM.Builders.Extensions
if (type.IsAnonymous()) if (type.IsAnonymous())
throw new InvalidOperationException(string.Format("Cant assign anonymous type as a table ({0}).", type.FullName)); throw new InvalidOperationException(string.Format("Cant assign anonymous type as a table ({0}).", type.FullName));
var mapper = DynamicMapperCache.GetMapper(type); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
if (mapper == null) if (mapper == null)
throw new InvalidOperationException("Cant assign unmapable type as a table."); throw new InvalidOperationException("Cant assign unmapable type as a table.");

View File

@@ -51,12 +51,12 @@ namespace DynamORM.Builders.Extensions
{ {
if (func == null) throw new ArgumentNullException("Array of functions cannot be null."); if (func == null) throw new ArgumentNullException("Array of functions cannot be null.");
using (var parser = DynamicParser.Parse(func)) using (DynamicParser parser = DynamicParser.Parse(func))
{ {
string condition = null; string condition = null;
bool and = true; bool and = true;
var result = parser.Result; object result = parser.Result;
if (result is string) if (result is string)
{ {
condition = (string)result; condition = (string)result;
@@ -76,8 +76,8 @@ namespace DynamORM.Builders.Extensions
// Intercepting the 'x => x.And()' and 'x => x.Or()' virtual methods... // Intercepting the 'x => x.And()' and 'x => x.Or()' virtual methods...
if (result is DynamicParser.Node.Method && ((DynamicParser.Node.Method)result).Host is DynamicParser.Node.Argument) if (result is DynamicParser.Node.Method && ((DynamicParser.Node.Method)result).Host is DynamicParser.Node.Argument)
{ {
var node = (DynamicParser.Node.Method)result; DynamicParser.Node.Method node = (DynamicParser.Node.Method)result;
var name = node.Name.ToUpper(); string name = node.Name.ToUpper();
if (name == "AND" || name == "OR") if (name == "AND" || name == "OR")
{ {
object[] args = ((DynamicParser.Node.Method)node).Arguments; object[] args = ((DynamicParser.Node.Method)node).Arguments;
@@ -166,7 +166,7 @@ namespace DynamORM.Builders.Extensions
{ {
if (value is DynamicColumn) if (value is DynamicColumn)
{ {
var v = (DynamicColumn)value; DynamicColumn v = (DynamicColumn)value;
if (string.IsNullOrEmpty(v.ColumnName)) if (string.IsNullOrEmpty(v.ColumnName))
v.ColumnName = column; v.ColumnName = column;
@@ -206,11 +206,11 @@ namespace DynamORM.Builders.Extensions
return builder; return builder;
} }
var dict = conditions.ToDictionary(); IDictionary<string, object> dict = conditions.ToDictionary();
var mapper = DynamicMapperCache.GetMapper(conditions.GetType()); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(conditions.GetType());
var table = dict.TryGetValue("_table").NullOr(x => x.ToString(), string.Empty); string table = dict.TryGetValue("_table").NullOr(x => x.ToString(), string.Empty);
foreach (var condition in dict) foreach (KeyValuePair<string, object> condition in dict)
{ {
if (mapper.Ignored.Contains(condition.Key) || condition.Key == "_table") if (mapper.Ignored.Contains(condition.Key) || condition.Key == "_table")
continue; continue;

View File

@@ -62,7 +62,7 @@ namespace DynamORM.Builders.Implementation
/// <remarks>This method must be override by derived classes.</remarks> /// <remarks>This method must be override by derived classes.</remarks>
public override string CommandText() public override string CommandText()
{ {
var info = Tables.Single(); ITableInfo info = Tables.Single();
return string.Format("DELETE FROM {0}{1}{2}{3}", return string.Format("DELETE FROM {0}{1}{2}{3}",
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)), string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
Database.DecorateName(info.Name), Database.DecorateName(info.Name),

View File

@@ -30,6 +30,7 @@
*/ */
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using DynamORM.Helpers.Dynamics; using DynamORM.Helpers.Dynamics;
using DynamORM.Mapper; using DynamORM.Mapper;
@@ -66,7 +67,7 @@ namespace DynamORM.Builders.Implementation
/// <remarks>This method must be override by derived classes.</remarks> /// <remarks>This method must be override by derived classes.</remarks>
public override string CommandText() public override string CommandText()
{ {
var info = Tables.Single(); ITableInfo info = Tables.Single();
return string.Format("INSERT INTO {0}{1} ({2}) VALUES ({3})", return string.Format("INSERT INTO {0}{1} ({2}) VALUES ({3})",
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)), string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
Database.DecorateName(info.Name), _columns, _values); Database.DecorateName(info.Name), _columns, _values);
@@ -91,7 +92,7 @@ namespace DynamORM.Builders.Implementation
int index = InsertFunc(-1, fn); int index = InsertFunc(-1, fn);
if (func != null) if (func != null)
foreach (var f in func) foreach (Func<dynamic, object> f in func)
index = InsertFunc(index, f); index = InsertFunc(index, f);
return this; return this;
@@ -104,9 +105,9 @@ namespace DynamORM.Builders.Implementation
if (f == null) if (f == null)
throw new ArgumentNullException(string.Format("Specification #{0} cannot be null.", index)); throw new ArgumentNullException(string.Format("Specification #{0} cannot be null.", index));
using (var parser = DynamicParser.Parse(f)) using (DynamicParser parser = DynamicParser.Parse(f))
{ {
var result = parser.Result; object result = parser.Result;
if (result == null) if (result == null)
throw new ArgumentException(string.Format("Specification #{0} resolves to null.", index)); throw new ArgumentException(string.Format("Specification #{0} resolves to null.", index));
@@ -117,7 +118,7 @@ namespace DynamORM.Builders.Implementation
// When 'x => x.Table.Column = value' or 'x => x.Column = value'... // When 'x => x.Table.Column = value' or 'x => x.Column = value'...
if (result is DynamicParser.Node.SetMember) if (result is DynamicParser.Node.SetMember)
{ {
var node = (DynamicParser.Node.SetMember)result; DynamicParser.Node.SetMember node = (DynamicParser.Node.SetMember)result;
DynamicSchemaColumn? col = GetColumnFromSchema(node.Name); DynamicSchemaColumn? col = GetColumnFromSchema(node.Name);
main = Database.DecorateName(node.Name); main = Database.DecorateName(node.Name);
@@ -134,7 +135,7 @@ namespace DynamORM.Builders.Implementation
} }
// Other specifications are considered invalid... // Other specifications are considered invalid...
var err = string.Format("Specification '{0}' is invalid.", result); string err = string.Format("Specification '{0}' is invalid.", result);
str = Parse(result); str = Parse(result);
if (str.Contains("=")) err += " May have you used a '==' instead of a '=' operator?"; if (str.Contains("=")) err += " May have you used a '==' instead of a '=' operator?";
throw new ArgumentException(err); throw new ArgumentException(err);
@@ -149,7 +150,7 @@ namespace DynamORM.Builders.Implementation
{ {
if (value is DynamicColumn) if (value is DynamicColumn)
{ {
var v = (DynamicColumn)value; DynamicColumn v = (DynamicColumn)value;
if (string.IsNullOrEmpty(v.ColumnName)) if (string.IsNullOrEmpty(v.ColumnName))
v.ColumnName = column; v.ColumnName = column;
@@ -171,7 +172,7 @@ namespace DynamORM.Builders.Implementation
{ {
if (o is DynamicColumn) if (o is DynamicColumn)
{ {
var column = (DynamicColumn)o; DynamicColumn column = (DynamicColumn)o;
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName); DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
string main = FixObjectName(column.ColumnName, onlyColumn: true); string main = FixObjectName(column.ColumnName, onlyColumn: true);
@@ -183,23 +184,23 @@ namespace DynamORM.Builders.Implementation
return this; return this;
} }
var dict = o.ToDictionary(); IDictionary<string, object> dict = o.ToDictionary();
var mapper = DynamicMapperCache.GetMapper(o.GetType()); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(o.GetType());
if (mapper != null) if (mapper != null)
{ {
foreach (var con in dict) foreach (KeyValuePair<string, object> con in dict)
if (!mapper.Ignored.Contains(con.Key)) if (!mapper.Ignored.Contains(con.Key))
{ {
var colName = mapper.PropertyMap.TryGetValue(con.Key) ?? con.Key; string colName = mapper.PropertyMap.TryGetValue(con.Key) ?? con.Key;
var propMap = mapper.ColumnsMap.TryGetValue(colName.ToLower()); DynamicPropertyInvoker propMap = mapper.ColumnsMap.TryGetValue(colName.ToLower());
if (propMap == null || propMap.Column == null || !propMap.Column.IsNoInsert) if (propMap == null || propMap.Column == null || !propMap.Column.IsNoInsert)
Insert(colName, con.Value); Insert(colName, con.Value);
} }
} }
else else
foreach (var con in dict) foreach (KeyValuePair<string, object> con in dict)
Insert(con.Key, con.Value); Insert(con.Key, con.Value);
return this; return this;

View File

@@ -26,6 +26,7 @@
* THE POSSIBILITY OF SUCH DAMAGE. * THE POSSIBILITY OF SUCH DAMAGE.
*/ */
using System.Data;
using DynamORM.Builders.Extensions; using DynamORM.Builders.Extensions;
namespace DynamORM.Builders.Implementation namespace DynamORM.Builders.Implementation
@@ -59,8 +60,8 @@ namespace DynamORM.Builders.Implementation
/// <returns>Result of an execution..</returns> /// <returns>Result of an execution..</returns>
public virtual int Execute() public virtual int Execute()
{ {
using (var con = Database.Open()) using (IDbConnection con = Database.Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(this) .SetCommand(this)

View File

@@ -97,7 +97,7 @@ namespace DynamORM.Builders.Implementation
public TableInfo(DynamicDatabase db, Type type, string alias = null, string owner = null) public TableInfo(DynamicDatabase db, Type type, string alias = null, string owner = null)
: this() : this()
{ {
var mapper = DynamicMapperCache.GetMapper(type); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
Name = mapper.Table == null || string.IsNullOrEmpty(mapper.Table.Name) ? Name = mapper.Table == null || string.IsNullOrEmpty(mapper.Table.Name) ?
mapper.Type.Name : mapper.Table.Name; mapper.Type.Name : mapper.Table.Name;
@@ -371,7 +371,7 @@ namespace DynamORM.Builders.Implementation
// If node is a delegate, parse it to create the logical tree... // If node is a delegate, parse it to create the logical tree...
if (node is Delegate) if (node is Delegate)
{ {
using (var p = DynamicParser.Parse((Delegate)node)) using (DynamicParser p = DynamicParser.Parse((Delegate)node))
node = p.Result; node = p.Result;
return Parse(node, ref columnSchema, pars, rawstr, decorate: decorate); // Intercept containers as in (x => "string") return Parse(node, ref columnSchema, pars, rawstr, decorate: decorate); // Intercept containers as in (x => "string")
@@ -409,7 +409,7 @@ namespace DynamORM.Builders.Implementation
throw new InvalidOperationException(string.Format("The parameters in this command '{0}' cannot be added to a null collection.", node.Parameters)); throw new InvalidOperationException(string.Format("The parameters in this command '{0}' cannot be added to a null collection.", node.Parameters));
// Copy parameters to new comand // Copy parameters to new comand
foreach (var parameter in node.Parameters) foreach (KeyValuePair<string, IParameter> parameter in node.Parameters)
pars.Add(parameter.Key, parameter.Value); pars.Add(parameter.Key, parameter.Value);
return string.Format("({0})", str); return string.Format("({0})", str);
@@ -574,11 +574,11 @@ namespace DynamORM.Builders.Implementation
if (node.Arguments.Length > 2) if (node.Arguments.Length > 2)
throw new ArgumentException("BETWEEN method expects at most two arguments: " + node.Arguments.Sketch()); throw new ArgumentException("BETWEEN method expects at most two arguments: " + node.Arguments.Sketch());
var arguments = node.Arguments; object[] arguments = node.Arguments;
if (arguments.Length == 1 && (arguments[0] is IEnumerable<object> || arguments[0] is Array) && !(arguments[0] is byte[])) if (arguments.Length == 1 && (arguments[0] is IEnumerable<object> || arguments[0] is Array) && !(arguments[0] is byte[]))
{ {
var vals = arguments[0] as IEnumerable<object>; IEnumerable<object> vals = arguments[0] as IEnumerable<object>;
if (vals == null && arguments[0] is Array) if (vals == null && arguments[0] is Array)
vals = ((Array)arguments[0]).Cast<object>() as IEnumerable<object>; vals = ((Array)arguments[0]).Cast<object>() as IEnumerable<object>;
@@ -599,20 +599,20 @@ namespace DynamORM.Builders.Implementation
bool firstParam = true; bool firstParam = true;
StringBuilder sbin = new StringBuilder(); StringBuilder sbin = new StringBuilder();
foreach (var arg in node.Arguments) foreach (object arg in node.Arguments)
{ {
if (!firstParam) if (!firstParam)
sbin.Append(", "); sbin.Append(", ");
if ((arg is IEnumerable<object> || arg is Array) && !(arg is byte[])) if ((arg is IEnumerable<object> || arg is Array) && !(arg is byte[]))
{ {
var vals = arg as IEnumerable<object>; IEnumerable<object> vals = arg as IEnumerable<object>;
if (vals == null && arg is Array) if (vals == null && arg is Array)
vals = ((Array)arg).Cast<object>() as IEnumerable<object>; vals = ((Array)arg).Cast<object>() as IEnumerable<object>;
if (vals != null) if (vals != null)
foreach (var val in vals) foreach (object val in vals)
{ {
if (!firstParam) if (!firstParam)
sbin.Append(", "); sbin.Append(", ");
@@ -729,7 +729,7 @@ namespace DynamORM.Builders.Implementation
bool wellKnownName = VirtualMode && node is String && ((String)node).StartsWith("[$") && ((String)node).EndsWith("]") && ((String)node).Length > 4; bool wellKnownName = VirtualMode && node is String && ((String)node).StartsWith("[$") && ((String)node).EndsWith("]") && ((String)node).Length > 4;
// If we have a list of parameters to store it, let's parametrize it // If we have a list of parameters to store it, let's parametrize it
var par = new Parameter() Parameter par = new Parameter()
{ {
Name = wellKnownName ? ((String)node).Substring(2, ((String)node).Length - 3) : Guid.NewGuid().ToString(), Name = wellKnownName ? ((String)node).Substring(2, ((String)node).Length - 3) : Guid.NewGuid().ToString(),
Value = wellKnownName ? null : node, Value = wellKnownName ? null : node,
@@ -801,7 +801,7 @@ namespace DynamORM.Builders.Implementation
private string FixObjectNamePrivate(string f, bool onlyColumn = false) private string FixObjectNamePrivate(string f, bool onlyColumn = false)
{ {
var objects = f.Split('.') IEnumerable<string> objects = f.Split('.')
.Select(x => Database.StripName(x)); .Select(x => Database.StripName(x));
if (onlyColumn || objects.Count() == 1) if (onlyColumn || objects.Count() == 1)
@@ -821,11 +821,11 @@ namespace DynamORM.Builders.Implementation
//// return null; //// return null;
// First we need to get real column name and it's owner if exist. // First we need to get real column name and it's owner if exist.
var parts = colName.Split('.'); string[] parts = colName.Split('.');
for (int i = 0; i < parts.Length; i++) for (int i = 0; i < parts.Length; i++)
parts[i] = Database.StripName(parts[i]); parts[i] = Database.StripName(parts[i]);
var columnName = parts.Last(); string columnName = parts.Last();
// Get table name from mapper // Get table name from mapper
string tableName = table; string tableName = table;
@@ -842,7 +842,7 @@ namespace DynamORM.Builders.Implementation
} }
// Try to get table info from cache // Try to get table info from cache
var tableInfo = !string.IsNullOrEmpty(tableName) ? ITableInfo tableInfo = !string.IsNullOrEmpty(tableName) ?
Tables.FirstOrDefault(x => !string.IsNullOrEmpty(x.Alias) && x.Alias.ToLower() == tableName) ?? Tables.FirstOrDefault(x => !string.IsNullOrEmpty(x.Alias) && x.Alias.ToLower() == tableName) ??
Tables.FirstOrDefault(x => x.Name.ToLower() == tableName.ToLower()) ?? Tables.FirstOrDefault() : Tables.FirstOrDefault(x => x.Name.ToLower() == tableName.ToLower()) ?? Tables.FirstOrDefault() :
this is DynamicModifyBuilder ? Tables.FirstOrDefault() : null; this is DynamicModifyBuilder ? Tables.FirstOrDefault() : null;
@@ -873,7 +873,7 @@ namespace DynamORM.Builders.Implementation
if (Parameters != null) if (Parameters != null)
{ {
foreach (var p in Parameters) foreach (KeyValuePair<string, IParameter> p in Parameters)
p.Value.Dispose(); p.Value.Dispose();
Parameters.Clear(); Parameters.Clear();
@@ -882,7 +882,7 @@ namespace DynamORM.Builders.Implementation
if (Tables != null) if (Tables != null)
{ {
foreach (var t in Tables) foreach (ITableInfo t in Tables)
t.Dispose(); t.Dispose();
Tables.Clear(); Tables.Clear();

View File

@@ -100,48 +100,6 @@ namespace DynamORM.Builders.Implementation
#region Execution #region Execution
/*/// <summary>Execute this builder.</summary>
/// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerator<dynamic> GetEnumerator()
{
using (var con = Database.Open())
using (var cmd = con.CreateCommand())
{
using (var rdr = cmd
.SetCommand(this)
.ExecuteReader())
while (rdr.Read())
{
dynamic val = null;
// Work around to avoid yield being in try...catchblock:
// http://stackoverflow.com/questions/346365/why-cant-yield-return-appear-inside-a-try-block-with-a-catch
try
{
val = rdr.RowToDynamic();
}
catch (ArgumentException argex)
{
var sb = new StringBuilder();
cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
argex.InnerException.NullOr(a => a, argex));
}
yield return val;
}
}
}
/// <summary>Execute this builder.</summary>
/// <returns>Enumerator of objects expanded from query.</returns>
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}*/
/// <summary>Execute this builder.</summary> /// <summary>Execute this builder.</summary>
/// <returns>Enumerator of objects expanded from query.</returns> /// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Execute() public virtual IEnumerable<dynamic> Execute()

View File

@@ -30,6 +30,7 @@
*/ */
using System; using System;
using System.Collections.Generic;
using System.Linq; using System.Linq;
using DynamORM.Builders.Extensions; using DynamORM.Builders.Extensions;
using DynamORM.Helpers.Dynamics; using DynamORM.Helpers.Dynamics;
@@ -57,7 +58,7 @@ namespace DynamORM.Builders.Implementation
/// <remarks>This method must be override by derived classes.</remarks> /// <remarks>This method must be override by derived classes.</remarks>
public override string CommandText() public override string CommandText()
{ {
var info = Tables.Single(); ITableInfo info = Tables.Single();
return string.Format("UPDATE {0}{1} SET {2}{3}{4}", return string.Format("UPDATE {0}{1} SET {2}{3}{4}",
string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)), string.IsNullOrEmpty(info.Owner) ? string.Empty : string.Format("{0}.", Database.DecorateName(info.Owner)),
Database.DecorateName(info.Name), _columns, Database.DecorateName(info.Name), _columns,
@@ -93,7 +94,7 @@ namespace DynamORM.Builders.Implementation
{ {
if (conditions is DynamicColumn) if (conditions is DynamicColumn)
{ {
var column = (DynamicColumn)conditions; DynamicColumn column = (DynamicColumn)conditions;
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName); DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
@@ -108,10 +109,10 @@ namespace DynamORM.Builders.Implementation
return this; return this;
} }
var dict = conditions.ToDictionary(); IDictionary<string, object> dict = conditions.ToDictionary();
var mapper = DynamicMapperCache.GetMapper(conditions.GetType()); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(conditions.GetType());
foreach (var con in dict) foreach (KeyValuePair<string, object> con in dict)
{ {
if (mapper.Ignored.Contains(con.Key)) if (mapper.Ignored.Contains(con.Key))
continue; continue;
@@ -134,7 +135,7 @@ namespace DynamORM.Builders.Implementation
} }
} }
var propMap = mapper.ColumnsMap.TryGetValue(colName.ToLower()); DynamicPropertyInvoker propMap = mapper.ColumnsMap.TryGetValue(colName.ToLower());
if (propMap == null || propMap.Column == null || !propMap.Column.IsNoUpdate) if (propMap == null || propMap.Column == null || !propMap.Column.IsNoUpdate)
Values(colName, con.Value); Values(colName, con.Value);
} }
@@ -160,7 +161,7 @@ namespace DynamORM.Builders.Implementation
throw new ArgumentNullException("Array of specifications cannot be null."); throw new ArgumentNullException("Array of specifications cannot be null.");
int index = -1; int index = -1;
foreach (var f in func) foreach (Func<dynamic, object> f in func)
{ {
index++; index++;
if (f == null) if (f == null)
@@ -168,7 +169,7 @@ namespace DynamORM.Builders.Implementation
object result = null; object result = null;
using (var p = DynamicParser.Parse(f)) using (DynamicParser p = DynamicParser.Parse(f))
result = p.Result; result = p.Result;
if (result == null) if (result == null)
@@ -181,7 +182,7 @@ namespace DynamORM.Builders.Implementation
// When 'x => x.Table.Column = value' or 'x => x.Column = value'... // When 'x => x.Table.Column = value' or 'x => x.Column = value'...
if (result is DynamicParser.Node.SetMember) if (result is DynamicParser.Node.SetMember)
{ {
var node = (DynamicParser.Node.SetMember)result; DynamicParser.Node.SetMember node = (DynamicParser.Node.SetMember)result;
DynamicSchemaColumn? col = GetColumnFromSchema(node.Name); DynamicSchemaColumn? col = GetColumnFromSchema(node.Name);
main = Database.DecorateName(node.Name); main = Database.DecorateName(node.Name);
@@ -198,7 +199,7 @@ namespace DynamORM.Builders.Implementation
} }
// Other specifications are considered invalid... // Other specifications are considered invalid...
var err = string.Format("Specification '{0}' is invalid.", result); string err = string.Format("Specification '{0}' is invalid.", result);
str = Parse(result); str = Parse(result);
if (str.Contains("=")) err += " May have you used a '==' instead of a '=' operator?"; if (str.Contains("=")) err += " May have you used a '==' instead of a '=' operator?";
throw new ArgumentException(err); throw new ArgumentException(err);
@@ -215,7 +216,7 @@ namespace DynamORM.Builders.Implementation
{ {
if (value is DynamicColumn) if (value is DynamicColumn)
{ {
var v = (DynamicColumn)value; DynamicColumn v = (DynamicColumn)value;
if (string.IsNullOrEmpty(v.ColumnName)) if (string.IsNullOrEmpty(v.ColumnName))
v.ColumnName = column; v.ColumnName = column;
@@ -237,29 +238,29 @@ namespace DynamORM.Builders.Implementation
{ {
if (o is DynamicColumn) if (o is DynamicColumn)
{ {
var column = (DynamicColumn)o; DynamicColumn column = (DynamicColumn)o;
DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName); DynamicSchemaColumn? col = column.Schema ?? GetColumnFromSchema(column.ColumnName);
string main = FixObjectName(column.ColumnName, onlyColumn: true); string main = FixObjectName(column.ColumnName, onlyColumn: true);
string value = Parse(column.Value, ref col, pars: Parameters, nulls: true); string value = Parse(column.Value, ref col, pars: Parameters, nulls: true);
var str = string.Format("{0} = {1}", main, value); string str = string.Format("{0} = {1}", main, value);
_columns = _columns == null ? str : string.Format("{0}, {1}", _columns, str); _columns = _columns == null ? str : string.Format("{0}, {1}", _columns, str);
return this; return this;
} }
var dict = o.ToDictionary(); IDictionary<string, object> dict = o.ToDictionary();
var mapper = DynamicMapperCache.GetMapper(o.GetType()); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(o.GetType());
if (mapper != null) if (mapper != null)
{ {
foreach (var con in dict) foreach (KeyValuePair<string, object> con in dict)
if (!mapper.Ignored.Contains(con.Key)) if (!mapper.Ignored.Contains(con.Key))
Values(mapper.PropertyMap.TryGetValue(con.Key) ?? con.Key, con.Value); Values(mapper.PropertyMap.TryGetValue(con.Key) ?? con.Key, con.Value);
} }
else else
foreach (var con in dict) foreach (KeyValuePair<string, object> con in dict)
Values(con.Key, con.Value); Values(con.Key, con.Value);
return this; return this;

View File

@@ -390,7 +390,7 @@ namespace DynamORM
public static DynamicColumn ParseSelectColumn(string column) public static DynamicColumn ParseSelectColumn(string column)
{ {
// Split column description // Split column description
var parts = column.Split(':'); string[] parts = column.Split(':');
if (parts.Length > 0) if (parts.Length > 0)
{ {
@@ -416,7 +416,7 @@ namespace DynamORM
public static DynamicColumn ParseOrderByColumn(string column) public static DynamicColumn ParseOrderByColumn(string column)
{ {
// Split column description // Split column description
var parts = column.Split(':'); string[] parts = column.Split(':');
if (parts.Length > 0) if (parts.Length > 0)
{ {

View File

@@ -27,6 +27,7 @@
*/ */
using System; using System;
using System.Collections.Generic;
using System.Data; using System.Data;
using DynamORM.Helpers; using DynamORM.Helpers;
@@ -267,7 +268,7 @@ namespace DynamORM
{ {
if (_con != null) if (_con != null)
{ {
var pool = _db.CommandsPool.TryGetValue(_con.Connection); List<IDbCommand> pool = _db.CommandsPool.TryGetValue(_con.Connection);
if (pool != null && pool.Contains(this)) if (pool != null && pool.Contains(this))
pool.Remove(this); pool.Remove(this);

View File

@@ -122,6 +122,10 @@ namespace DynamORM
/// dump commands to console or not.</summary> /// dump commands to console or not.</summary>
public bool DumpCommands { get; set; } public bool DumpCommands { get; set; }
/// <summary>Gets or sets the dump command delegate.</summary>
/// <value>The dump command delegate.</value>
public Action<IDbCommand, string> DumpCommandDelegate { get; set; }
/// <summary>Initializes a new instance of the <see cref="DynamicDatabase" /> class.</summary> /// <summary>Initializes a new instance of the <see cref="DynamicDatabase" /> class.</summary>
/// <param name="provider">Database provider by name.</param> /// <param name="provider">Database provider by name.</param>
/// <param name="connectionString">Connection string to provided database.</param> /// <param name="connectionString">Connection string to provided database.</param>
@@ -245,7 +249,7 @@ namespace DynamORM
/// <param name="dynamicTable">Disposed dynamic table.</param> /// <param name="dynamicTable">Disposed dynamic table.</param>
internal void RemoveFromCache(DynamicTable dynamicTable) internal void RemoveFromCache(DynamicTable dynamicTable)
{ {
foreach (var item in TablesCache.Where(kvp => kvp.Value == dynamicTable).ToList()) foreach (KeyValuePair<string, DynamicTable> item in TablesCache.Where(kvp => kvp.Value == dynamicTable).ToList())
TablesCache.Remove(item.Key); TablesCache.Remove(item.Key);
} }
@@ -341,27 +345,27 @@ namespace DynamORM
public virtual int Insert<T>(IEnumerable<T> e) where T : class public virtual int Insert<T>(IEnumerable<T> e) where T : class
{ {
int affected = 0; int affected = 0;
var mapper = DynamicMapperCache.GetMapper(typeof(T)); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(typeof(T));
if (mapper != null) if (mapper != null)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var tra = con.BeginTransaction()) using (IDbTransaction tra = con.BeginTransaction())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
try try
{ {
var parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>(); Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
if (!string.IsNullOrEmpty(mapper.InsertCommandText)) if (!string.IsNullOrEmpty(mapper.InsertCommandText))
{ {
cmd.CommandText = mapper.InsertCommandText; cmd.CommandText = mapper.InsertCommandText;
foreach (var col in mapper.ColumnsMap.Values foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
.Where(di => !di.Ignore && di.InsertCommandParameter != null) .Where(di => !di.Ignore && di.InsertCommandParameter != null)
.OrderBy(di => di.InsertCommandParameter.Ordinal)) .OrderBy(di => di.InsertCommandParameter.Ordinal))
{ {
var para = cmd.CreateParameter(); IDbDataParameter para = cmd.CreateParameter();
para.ParameterName = col.InsertCommandParameter.Name; para.ParameterName = col.InsertCommandParameter.Name;
para.DbType = col.InsertCommandParameter.Type; para.DbType = col.InsertCommandParameter.Type;
cmd.Parameters.Add(para); cmd.Parameters.Add(para);
@@ -372,9 +376,9 @@ namespace DynamORM
else else
PrepareBatchInsert<T>(mapper, cmd, parameters); PrepareBatchInsert<T>(mapper, cmd, parameters);
foreach (var o in e) foreach (T o in e)
{ {
foreach (var m in parameters) foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parameters)
m.Key.Value = m.Value.Get(o); m.Key.Value = m.Value.Get(o);
affected += cmd.ExecuteNonQuery(); affected += cmd.ExecuteNonQuery();
@@ -389,7 +393,7 @@ namespace DynamORM
affected = 0; affected = 0;
var problematicCommand = new StringBuilder(); StringBuilder problematicCommand = new StringBuilder();
cmd.Dump(problematicCommand); cmd.Dump(problematicCommand);
throw new InvalidOperationException(problematicCommand.ToString(), ex); throw new InvalidOperationException(problematicCommand.ToString(), ex);
@@ -439,27 +443,27 @@ namespace DynamORM
public virtual int Update<T>(IEnumerable<T> e) where T : class public virtual int Update<T>(IEnumerable<T> e) where T : class
{ {
int affected = 0; int affected = 0;
var mapper = DynamicMapperCache.GetMapper(typeof(T)); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(typeof(T));
if (mapper != null) if (mapper != null)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var tra = con.BeginTransaction()) using (IDbTransaction tra = con.BeginTransaction())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
try try
{ {
var parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>(); Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
if (!string.IsNullOrEmpty(mapper.UpdateCommandText)) if (!string.IsNullOrEmpty(mapper.UpdateCommandText))
{ {
cmd.CommandText = mapper.UpdateCommandText; cmd.CommandText = mapper.UpdateCommandText;
foreach (var col in mapper.ColumnsMap.Values foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
.Where(di => !di.Ignore && di.UpdateCommandParameter != null) .Where(di => !di.Ignore && di.UpdateCommandParameter != null)
.OrderBy(di => di.UpdateCommandParameter.Ordinal)) .OrderBy(di => di.UpdateCommandParameter.Ordinal))
{ {
var para = cmd.CreateParameter(); IDbDataParameter para = cmd.CreateParameter();
para.ParameterName = col.UpdateCommandParameter.Name; para.ParameterName = col.UpdateCommandParameter.Name;
para.DbType = col.UpdateCommandParameter.Type; para.DbType = col.UpdateCommandParameter.Type;
cmd.Parameters.Add(para); cmd.Parameters.Add(para);
@@ -470,9 +474,9 @@ namespace DynamORM
else else
PrepareBatchUpdate<T>(mapper, cmd, parameters); PrepareBatchUpdate<T>(mapper, cmd, parameters);
foreach (var o in e) foreach (T o in e)
{ {
foreach (var m in parameters) foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parameters)
m.Key.Value = m.Value.Get(o); m.Key.Value = m.Value.Get(o);
affected += cmd.ExecuteNonQuery(); affected += cmd.ExecuteNonQuery();
@@ -487,7 +491,7 @@ namespace DynamORM
affected = 0; affected = 0;
var problematicCommand = new StringBuilder(); StringBuilder problematicCommand = new StringBuilder();
cmd.Dump(problematicCommand); cmd.Dump(problematicCommand);
throw new InvalidOperationException(problematicCommand.ToString(), ex); throw new InvalidOperationException(problematicCommand.ToString(), ex);
@@ -505,30 +509,30 @@ namespace DynamORM
public virtual int UpdateOrInsert<T>(IEnumerable<T> e) where T : class public virtual int UpdateOrInsert<T>(IEnumerable<T> e) where T : class
{ {
int affected = 0; int affected = 0;
var mapper = DynamicMapperCache.GetMapper(typeof(T)); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(typeof(T));
if (mapper != null) if (mapper != null)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var tra = con.BeginTransaction()) using (IDbTransaction tra = con.BeginTransaction())
using (var cmdUp = con.CreateCommand()) using (IDbCommand cmdUp = con.CreateCommand())
using (var cmdIn = con.CreateCommand()) using (IDbCommand cmdIn = con.CreateCommand())
{ {
try try
{ {
#region Update #region Update
var parametersUp = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>(); Dictionary<IDbDataParameter, DynamicPropertyInvoker> parametersUp = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
if (!string.IsNullOrEmpty(mapper.UpdateCommandText)) if (!string.IsNullOrEmpty(mapper.UpdateCommandText))
{ {
cmdUp.CommandText = mapper.UpdateCommandText; cmdUp.CommandText = mapper.UpdateCommandText;
foreach (var col in mapper.ColumnsMap.Values foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
.Where(di => !di.Ignore && di.UpdateCommandParameter != null) .Where(di => !di.Ignore && di.UpdateCommandParameter != null)
.OrderBy(di => di.UpdateCommandParameter.Ordinal)) .OrderBy(di => di.UpdateCommandParameter.Ordinal))
{ {
var para = cmdUp.CreateParameter(); IDbDataParameter para = cmdUp.CreateParameter();
para.ParameterName = col.UpdateCommandParameter.Name; para.ParameterName = col.UpdateCommandParameter.Name;
para.DbType = col.UpdateCommandParameter.Type; para.DbType = col.UpdateCommandParameter.Type;
cmdUp.Parameters.Add(para); cmdUp.Parameters.Add(para);
@@ -543,17 +547,17 @@ namespace DynamORM
#region Insert #region Insert
var parametersIn = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>(); Dictionary<IDbDataParameter, DynamicPropertyInvoker> parametersIn = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
if (!string.IsNullOrEmpty(mapper.InsertCommandText)) if (!string.IsNullOrEmpty(mapper.InsertCommandText))
{ {
cmdIn.CommandText = mapper.InsertCommandText; cmdIn.CommandText = mapper.InsertCommandText;
foreach (var col in mapper.ColumnsMap.Values foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
.Where(di => !di.Ignore && di.InsertCommandParameter != null) .Where(di => !di.Ignore && di.InsertCommandParameter != null)
.OrderBy(di => di.InsertCommandParameter.Ordinal)) .OrderBy(di => di.InsertCommandParameter.Ordinal))
{ {
var para = cmdIn.CreateParameter(); IDbDataParameter para = cmdIn.CreateParameter();
para.ParameterName = col.InsertCommandParameter.Name; para.ParameterName = col.InsertCommandParameter.Name;
para.DbType = col.InsertCommandParameter.Type; para.DbType = col.InsertCommandParameter.Type;
cmdIn.Parameters.Add(para); cmdIn.Parameters.Add(para);
@@ -566,15 +570,15 @@ namespace DynamORM
#endregion Insert #endregion Insert
foreach (var o in e) foreach (T o in e)
{ {
foreach (var m in parametersUp) foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parametersUp)
m.Key.Value = m.Value.Get(o); m.Key.Value = m.Value.Get(o);
int a = cmdUp.ExecuteNonQuery(); int a = cmdUp.ExecuteNonQuery();
if (a == 0) if (a == 0)
{ {
foreach (var m in parametersIn) foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parametersIn)
m.Key.Value = m.Value.Get(o); m.Key.Value = m.Value.Get(o);
a = cmdIn.ExecuteNonQuery(); a = cmdIn.ExecuteNonQuery();
@@ -592,7 +596,7 @@ namespace DynamORM
affected = 0; affected = 0;
var problematicCommand = new StringBuilder(); StringBuilder problematicCommand = new StringBuilder();
cmdUp.Dump(problematicCommand); cmdUp.Dump(problematicCommand);
throw new InvalidOperationException(problematicCommand.ToString(), ex); throw new InvalidOperationException(problematicCommand.ToString(), ex);
@@ -634,27 +638,27 @@ namespace DynamORM
public virtual int Delete<T>(IEnumerable<T> e) where T : class public virtual int Delete<T>(IEnumerable<T> e) where T : class
{ {
int affected = 0; int affected = 0;
var mapper = DynamicMapperCache.GetMapper(typeof(T)); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(typeof(T));
if (mapper != null) if (mapper != null)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var tra = con.BeginTransaction()) using (IDbTransaction tra = con.BeginTransaction())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
try try
{ {
var parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>(); Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters = new Dictionary<IDbDataParameter, DynamicPropertyInvoker>();
if (!string.IsNullOrEmpty(mapper.DeleteCommandText)) if (!string.IsNullOrEmpty(mapper.DeleteCommandText))
{ {
cmd.CommandText = mapper.DeleteCommandText; cmd.CommandText = mapper.DeleteCommandText;
foreach (var col in mapper.ColumnsMap.Values foreach (DynamicPropertyInvoker col in mapper.ColumnsMap.Values
.Where(di => !di.Ignore && di.DeleteCommandParameter != null) .Where(di => !di.Ignore && di.DeleteCommandParameter != null)
.OrderBy(di => di.DeleteCommandParameter.Ordinal)) .OrderBy(di => di.DeleteCommandParameter.Ordinal))
{ {
var para = cmd.CreateParameter(); IDbDataParameter para = cmd.CreateParameter();
para.ParameterName = col.DeleteCommandParameter.Name; para.ParameterName = col.DeleteCommandParameter.Name;
para.DbType = col.DeleteCommandParameter.Type; para.DbType = col.DeleteCommandParameter.Type;
cmd.Parameters.Add(para); cmd.Parameters.Add(para);
@@ -665,9 +669,9 @@ namespace DynamORM
else else
PrepareBatchDelete<T>(mapper, cmd, parameters); PrepareBatchDelete<T>(mapper, cmd, parameters);
foreach (var o in e) foreach (T o in e)
{ {
foreach (var m in parameters) foreach (KeyValuePair<IDbDataParameter, DynamicPropertyInvoker> m in parameters)
m.Key.Value = m.Value.Get(o); m.Key.Value = m.Value.Get(o);
affected += cmd.ExecuteNonQuery(); affected += cmd.ExecuteNonQuery();
@@ -682,7 +686,7 @@ namespace DynamORM
affected = 0; affected = 0;
var problematicCommand = new StringBuilder(); StringBuilder problematicCommand = new StringBuilder();
cmd.Dump(problematicCommand); cmd.Dump(problematicCommand);
throw new InvalidOperationException(problematicCommand.ToString(), ex); throw new InvalidOperationException(problematicCommand.ToString(), ex);
@@ -696,11 +700,11 @@ namespace DynamORM
private void PrepareBatchInsert<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters) private void PrepareBatchInsert<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
{ {
DynamicPropertyInvoker currentprop = null; DynamicPropertyInvoker currentprop = null;
var temp = new Dictionary<string, DynamicPropertyInvoker>(); Dictionary<string, DynamicPropertyInvoker> temp = new Dictionary<string, DynamicPropertyInvoker>();
var schema = this.GetSchema<T>(); Dictionary<string, DynamicSchemaColumn> schema = this.GetSchema<T>();
int ord = 0; int ord = 0;
var ib = Insert<T>() IDynamicInsertQueryBuilder ib = Insert<T>()
.SetVirtualMode(true) .SetVirtualMode(true)
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop) .CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
.CreateParameterAction((p, cp) => .CreateParameterAction((p, cp) =>
@@ -714,10 +718,10 @@ namespace DynamORM
}; };
}); });
foreach (var prop in mapper.PropertyMap) foreach (KeyValuePair<string, string> prop in mapper.PropertyMap)
if (!mapper.Ignored.Contains(prop.Key)) if (!mapper.Ignored.Contains(prop.Key))
{ {
var col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key; string col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower()); currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
if (currentprop.Ignore || (currentprop.Column != null && currentprop.Column.IsNoInsert)) if (currentprop.Ignore || (currentprop.Column != null && currentprop.Column.IsNoInsert))
@@ -743,11 +747,11 @@ namespace DynamORM
private void PrepareBatchUpdate<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters) private void PrepareBatchUpdate<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
{ {
DynamicPropertyInvoker currentprop = null; DynamicPropertyInvoker currentprop = null;
var temp = new Dictionary<string, DynamicPropertyInvoker>(); Dictionary<string, DynamicPropertyInvoker> temp = new Dictionary<string, DynamicPropertyInvoker>();
var schema = this.GetSchema<T>(); Dictionary<string, DynamicSchemaColumn> schema = this.GetSchema<T>();
int ord = 0; int ord = 0;
var ib = Update<T>() IDynamicUpdateQueryBuilder ib = Update<T>()
.SetVirtualMode(true) .SetVirtualMode(true)
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop) .CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
.CreateParameterAction((p, cp) => .CreateParameterAction((p, cp) =>
@@ -761,10 +765,10 @@ namespace DynamORM
}; };
}); });
foreach (var prop in mapper.PropertyMap) foreach (KeyValuePair<string, string> prop in mapper.PropertyMap)
if (!mapper.Ignored.Contains(prop.Key)) if (!mapper.Ignored.Contains(prop.Key))
{ {
var col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key; string col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower()); currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
if (currentprop.Ignore) if (currentprop.Ignore)
@@ -772,7 +776,7 @@ namespace DynamORM
if (currentprop.Get != null) if (currentprop.Get != null)
{ {
var colS = schema == null ? null : schema.TryGetNullable(col.ToLower()); DynamicSchemaColumn? colS = schema == null ? null : schema.TryGetNullable(col.ToLower());
if (colS.HasValue) if (colS.HasValue)
{ {
@@ -816,11 +820,11 @@ namespace DynamORM
private void PrepareBatchDelete<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters) private void PrepareBatchDelete<T>(DynamicTypeMap mapper, IDbCommand cmd, Dictionary<IDbDataParameter, DynamicPropertyInvoker> parameters)
{ {
DynamicPropertyInvoker currentprop = null; DynamicPropertyInvoker currentprop = null;
var temp = new Dictionary<string, DynamicPropertyInvoker>(); Dictionary<string, DynamicPropertyInvoker> temp = new Dictionary<string, DynamicPropertyInvoker>();
var schema = this.GetSchema<T>(); Dictionary<string, DynamicSchemaColumn> schema = this.GetSchema<T>();
int ord = 0; int ord = 0;
var ib = Delete<T>() IDynamicDeleteQueryBuilder ib = Delete<T>()
.SetVirtualMode(true) .SetVirtualMode(true)
.CreateTemporaryParameterAction(p => temp[p.Name] = currentprop) .CreateTemporaryParameterAction(p => temp[p.Name] = currentprop)
.CreateParameterAction((p, cp) => .CreateParameterAction((p, cp) =>
@@ -834,10 +838,10 @@ namespace DynamORM
}; };
}); });
foreach (var prop in mapper.PropertyMap) foreach (KeyValuePair<string, string> prop in mapper.PropertyMap)
if (!mapper.Ignored.Contains(prop.Key)) if (!mapper.Ignored.Contains(prop.Key))
{ {
var col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key; string col = mapper.PropertyMap.TryGetValue(prop.Key) ?? prop.Key;
currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower()); currentprop = mapper.ColumnsMap.TryGetValue(col.ToLower());
if (currentprop.Ignore) if (currentprop.Ignore)
@@ -845,7 +849,7 @@ namespace DynamORM
if (currentprop.Get != null) if (currentprop.Get != null)
{ {
var colS = schema == null ? null : schema.TryGetNullable(col.ToLower()); DynamicSchemaColumn? colS = schema == null ? null : schema.TryGetNullable(col.ToLower());
if (colS != null) if (colS != null)
{ {
@@ -898,8 +902,8 @@ namespace DynamORM
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures."); throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(CommandType.StoredProcedure, procName) .SetCommand(CommandType.StoredProcedure, procName)
@@ -917,8 +921,8 @@ namespace DynamORM
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures."); throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(CommandType.StoredProcedure, procName) .SetCommand(CommandType.StoredProcedure, procName)
@@ -936,8 +940,8 @@ namespace DynamORM
if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures) if ((Options & DynamicDatabaseOptions.SupportStoredProcedures) != DynamicDatabaseOptions.SupportStoredProcedures)
throw new InvalidOperationException("Database connection desn't support stored procedures."); throw new InvalidOperationException("Database connection desn't support stored procedures.");
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(CommandType.StoredProcedure, procName) .SetCommand(CommandType.StoredProcedure, procName)
@@ -958,8 +962,8 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Execute(string sql, params object[] args) public virtual int Execute(string sql, params object[] args)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(sql).AddParameters(this, args) .SetCommand(sql).AddParameters(this, args)
@@ -972,8 +976,8 @@ namespace DynamORM
/// <returns>Number of affected rows.</returns> /// <returns>Number of affected rows.</returns>
public virtual int Execute(IDynamicQueryBuilder builder) public virtual int Execute(IDynamicQueryBuilder builder)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(builder) .SetCommand(builder)
@@ -988,19 +992,15 @@ namespace DynamORM
{ {
int ret = 0; int ret = 0;
using (var con = Open()) using (IDbConnection con = Open())
{ {
using (var trans = con.BeginTransaction()) using (IDbTransaction trans = con.BeginTransaction())
{ {
foreach (var builder in builders) foreach (IDynamicQueryBuilder builder in builders)
{ using (IDbCommand cmd = con.CreateCommand())
using (var cmd = con.CreateCommand())
{
ret += cmd ret += cmd
.SetCommand(builder) .SetCommand(builder)
.ExecuteNonQuery(); .ExecuteNonQuery();
}
}
trans.Commit(); trans.Commit();
} }
@@ -1021,8 +1021,8 @@ namespace DynamORM
/// <returns>Result of a query.</returns> /// <returns>Result of a query.</returns>
public virtual object Scalar(string sql, params object[] args) public virtual object Scalar(string sql, params object[] args)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(sql).AddParameters(this, args) .SetCommand(sql).AddParameters(this, args)
@@ -1035,8 +1035,8 @@ namespace DynamORM
/// <returns>Result of a query.</returns> /// <returns>Result of a query.</returns>
public virtual object Scalar(IDynamicQueryBuilder builder) public virtual object Scalar(IDynamicQueryBuilder builder)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(builder) .SetCommand(builder)
@@ -1055,8 +1055,8 @@ namespace DynamORM
/// <returns>Result of a query.</returns> /// <returns>Result of a query.</returns>
public virtual T ScalarAs<T>(string sql, params object[] args) public virtual T ScalarAs<T>(string sql, params object[] args)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(sql).AddParameters(this, args) .SetCommand(sql).AddParameters(this, args)
@@ -1071,8 +1071,8 @@ namespace DynamORM
/// <returns>Result of a query.</returns> /// <returns>Result of a query.</returns>
public virtual T ScalarAs<T>(IDynamicQueryBuilder builder, T defaultValue = default(T)) public virtual T ScalarAs<T>(IDynamicQueryBuilder builder, T defaultValue = default(T))
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
{ {
return cmd return cmd
.SetCommand(builder) .SetCommand(builder)
@@ -1094,9 +1094,9 @@ namespace DynamORM
/// <returns>Enumerator of objects expanded from query.</returns> /// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(string sql, params object[] args) public virtual IEnumerable<dynamic> Query(string sql, params object[] args)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
using (var rdr = cmd using (IDataReader rdr = cmd
.SetCommand(sql) .SetCommand(sql)
.AddParameters(this, args) .AddParameters(this, args)
.ExecuteReader()) .ExecuteReader())
@@ -1112,7 +1112,7 @@ namespace DynamORM
} }
catch (ArgumentException argex) catch (ArgumentException argex)
{ {
var sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
cmd.Dump(sb); cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb), throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
@@ -1128,9 +1128,9 @@ namespace DynamORM
/// <returns>Enumerator of objects expanded from query.</returns> /// <returns>Enumerator of objects expanded from query.</returns>
public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder) public virtual IEnumerable<dynamic> Query(IDynamicQueryBuilder builder)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand()) using (IDbCommand cmd = con.CreateCommand())
using (var rdr = cmd using (IDataReader rdr = cmd
.SetCommand(builder) .SetCommand(builder)
.ExecuteReader()) .ExecuteReader())
while (rdr.Read()) while (rdr.Read())
@@ -1145,7 +1145,7 @@ namespace DynamORM
} }
catch (ArgumentException argex) catch (ArgumentException argex)
{ {
var sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
cmd.Dump(sb); cmd.Dump(sb);
throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb), throw new ArgumentException(string.Format("{0}{1}{2}", argex.Message, Environment.NewLine, sb),
@@ -1165,8 +1165,8 @@ namespace DynamORM
/// <returns>Query schema.</returns> /// <returns>Query schema.</returns>
public Dictionary<string, DynamicSchemaColumn> GetQuerySchema(IDynamicSelectQueryBuilder builder) public Dictionary<string, DynamicSchemaColumn> GetQuerySchema(IDynamicSelectQueryBuilder builder)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand().SetCommand(builder)) using (IDbCommand cmd = con.CreateCommand().SetCommand(builder))
return ReadSchema(cmd) return ReadSchema(cmd)
.Distinct() .Distinct()
.ToDictionary(k => k.Name.ToLower(), k => k); .ToDictionary(k => k.Name.ToLower(), k => k);
@@ -1178,8 +1178,8 @@ namespace DynamORM
/// <returns>Query schema.</returns> /// <returns>Query schema.</returns>
public Dictionary<string, DynamicSchemaColumn> GetQuerySchema(string sql, params object[] args) public Dictionary<string, DynamicSchemaColumn> GetQuerySchema(string sql, params object[] args)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand().SetCommand(sql, args)) using (IDbCommand cmd = con.CreateCommand().SetCommand(sql, args))
return ReadSchema(cmd) return ReadSchema(cmd)
.Distinct() .Distinct()
.ToDictionary(k => k.Name.ToLower(), k => k); .ToDictionary(k => k.Name.ToLower(), k => k);
@@ -1273,7 +1273,7 @@ namespace DynamORM
{ {
lock (SyncLock) lock (SyncLock)
{ {
foreach (var s in Schema) foreach (KeyValuePair<string, Dictionary<string, DynamicSchemaColumn>> s in Schema)
if (s.Value != null) if (s.Value != null)
s.Value.Clear(); s.Value.Clear();
@@ -1288,8 +1288,8 @@ namespace DynamORM
/// If your database doesn't get those values in upper case (like most of the databases) you should override this method.</returns> /// If your database doesn't get those values in upper case (like most of the databases) you should override this method.</returns>
protected virtual IList<DynamicSchemaColumn> ReadSchema(string table, string owner) protected virtual IList<DynamicSchemaColumn> ReadSchema(string table, string owner)
{ {
using (var con = Open()) using (IDbConnection con = Open())
using (var cmd = con.CreateCommand() using (IDbCommand cmd = con.CreateCommand()
.SetCommand(string.Format("SELECT * FROM {0}{1} WHERE 1 = 0", .SetCommand(string.Format("SELECT * FROM {0}{1} WHERE 1 = 0",
!string.IsNullOrEmpty(owner) ? string.Format("{0}.", DecorateName(owner)) : string.Empty, !string.IsNullOrEmpty(owner) ? string.Format("{0}.", DecorateName(owner)) : string.Empty,
DecorateName(table)))) DecorateName(table))))
@@ -1303,11 +1303,11 @@ namespace DynamORM
/// If your database doesn't get those values in upper case (like most of the databases) you should override this method.</returns> /// If your database doesn't get those values in upper case (like most of the databases) you should override this method.</returns>
protected virtual IEnumerable<DynamicSchemaColumn> ReadSchema(IDbCommand cmd) protected virtual IEnumerable<DynamicSchemaColumn> ReadSchema(IDbCommand cmd)
{ {
using (var rdr = cmd.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo)) using (IDataReader rdr = cmd.ExecuteReader(CommandBehavior.SchemaOnly | CommandBehavior.KeyInfo))
using (var st = rdr.GetSchemaTable()) using (DataTable st = rdr.GetSchemaTable())
foreach (DataRow col in st.Rows) foreach (DataRow col in st.Rows)
{ {
var c = col.RowToDynamicUpper(); dynamic c = col.RowToDynamicUpper();
yield return new DynamicSchemaColumn yield return new DynamicSchemaColumn
{ {
@@ -1508,7 +1508,10 @@ namespace DynamORM
/// <param name="cmd">The command to dump.</param> /// <param name="cmd">The command to dump.</param>
public virtual void DumpCommand(IDbCommand cmd) public virtual void DumpCommand(IDbCommand cmd)
{ {
cmd.Dump(Console.Out); if (DumpCommandDelegate != null)
DumpCommandDelegate(cmd, cmd.DumpToString());
else
cmd.Dump(Console.Out);
} }
#endregion Decorators #endregion Decorators
@@ -1572,7 +1575,7 @@ namespace DynamORM
// Close all commands // Close all commands
if (CommandsPool.ContainsKey(connection)) if (CommandsPool.ContainsKey(connection))
{ {
var tmp = CommandsPool[connection].ToList(); List<IDbCommand> tmp = CommandsPool[connection].ToList();
tmp.ForEach(cmd => cmd.Dispose()); tmp.ForEach(cmd => cmd.Dispose());
CommandsPool[connection].Clear(); CommandsPool[connection].Clear();
@@ -1633,7 +1636,7 @@ namespace DynamORM
return _tempConn.BeginTransaction(null, null, () => return _tempConn.BeginTransaction(null, null, () =>
{ {
var t = TransactionPool.TryGetValue(_tempConn.Connection); Stack<IDbTransaction> t = TransactionPool.TryGetValue(_tempConn.Connection);
if (t == null | t.Count == 0) if (t == null | t.Count == 0)
{ {
@@ -1653,7 +1656,7 @@ namespace DynamORM
return _tempConn.BeginTransaction(il, null, () => return _tempConn.BeginTransaction(il, null, () =>
{ {
var t = TransactionPool.TryGetValue(_tempConn.Connection); Stack<IDbTransaction> t = TransactionPool.TryGetValue(_tempConn.Connection);
if (t == null | t.Count == 0) if (t == null | t.Count == 0)
{ {
@@ -1673,7 +1676,7 @@ namespace DynamORM
return _tempConn.BeginTransaction(null, custom, () => return _tempConn.BeginTransaction(null, custom, () =>
{ {
var t = TransactionPool.TryGetValue(_tempConn.Connection); Stack<IDbTransaction> t = TransactionPool.TryGetValue(_tempConn.Connection);
if (t == null | t.Count == 0) if (t == null | t.Count == 0)
{ {
@@ -1692,7 +1695,7 @@ namespace DynamORM
public void Dispose() public void Dispose()
{ {
#if !DYNAMORM_OMMIT_OLDSYNTAX #if !DYNAMORM_OMMIT_OLDSYNTAX
var tables = TablesCache.Values.ToList(); List<DynamicTable> tables = TablesCache.Values.ToList();
TablesCache.Clear(); TablesCache.Clear();
tables.ForEach(t => t.Dispose()); tables.ForEach(t => t.Dispose());
@@ -1700,12 +1703,12 @@ namespace DynamORM
tables = null; tables = null;
#endif #endif
foreach (var con in TransactionPool) foreach (KeyValuePair<IDbConnection, Stack<IDbTransaction>> con in TransactionPool)
{ {
// Close all commands // Close all commands
if (CommandsPool.ContainsKey(con.Key)) if (CommandsPool.ContainsKey(con.Key))
{ {
var tmp = CommandsPool[con.Key].ToList(); List<IDbCommand> tmp = CommandsPool[con.Key].ToList();
tmp.ForEach(cmd => cmd.Dispose()); tmp.ForEach(cmd => cmd.Dispose());
CommandsPool[con.Key].Clear(); CommandsPool[con.Key].Clear();

View File

@@ -209,7 +209,7 @@ namespace DynamORM
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, params object[] args) public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, params object[] args)
{ {
if (args != null && args.Count() > 0) if (args != null && args.Count() > 0)
foreach (var item in args) foreach (object item in args)
cmd.AddParameter(database, item); cmd.AddParameter(database, item);
return cmd; return cmd;
@@ -223,7 +223,7 @@ namespace DynamORM
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, ExpandoObject args) public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, ExpandoObject args)
{ {
if (args != null && args.Count() > 0) if (args != null && args.Count() > 0)
foreach (var item in args.ToDictionary()) foreach (KeyValuePair<string, object> item in args.ToDictionary())
cmd.AddParameter(database, item.Key, item.Value); cmd.AddParameter(database, item.Key, item.Value);
return cmd; return cmd;
@@ -237,7 +237,7 @@ namespace DynamORM
public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, DynamicExpando args) public static IDbCommand AddParameters(this IDbCommand cmd, DynamicDatabase database, DynamicExpando args)
{ {
if (args != null && args.Count() > 0) if (args != null && args.Count() > 0)
foreach (var item in args.ToDictionary()) foreach (KeyValuePair<string, object> item in args.ToDictionary())
cmd.AddParameter(database, item.Key, item.Value); cmd.AddParameter(database, item.Key, item.Value);
return cmd; return cmd;
@@ -261,7 +261,7 @@ namespace DynamORM
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns> /// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
public static IDbCommand AddParameter(this IDbCommand cmd, DynamicDatabase database, string name, object item) public static IDbCommand AddParameter(this IDbCommand cmd, DynamicDatabase database, string name, object item)
{ {
var p = cmd.CreateParameter(); IDbDataParameter p = cmd.CreateParameter();
p.ParameterName = name; p.ParameterName = name;
if (item == null || item == DBNull.Value) if (item == null || item == DBNull.Value)
@@ -294,7 +294,7 @@ namespace DynamORM
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns> /// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
public static IDbCommand AddParameter(this IDbCommand cmd, IDynamicQueryBuilder builder, DynamicSchemaColumn? col, object value) public static IDbCommand AddParameter(this IDbCommand cmd, IDynamicQueryBuilder builder, DynamicSchemaColumn? col, object value)
{ {
var p = cmd.CreateParameter(); IDbDataParameter p = cmd.CreateParameter();
p.ParameterName = builder.Database.GetParameterName(cmd.Parameters.Count); p.ParameterName = builder.Database.GetParameterName(cmd.Parameters.Count);
if (col.HasValue) if (col.HasValue)
@@ -339,10 +339,10 @@ namespace DynamORM
/// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns> /// <returns>Returns edited <see cref="System.Data.IDbCommand"/> instance.</returns>
public static IDbCommand AddParameter(this IDbCommand cmd, IDynamicQueryBuilder builder, DynamicColumn item) public static IDbCommand AddParameter(this IDbCommand cmd, IDynamicQueryBuilder builder, DynamicColumn item)
{ {
var p = cmd.CreateParameter(); IDbDataParameter p = cmd.CreateParameter();
p.ParameterName = builder.Database.GetParameterName(cmd.Parameters.Count); p.ParameterName = builder.Database.GetParameterName(cmd.Parameters.Count);
var col = item.Schema ?? (builder as DynamicQueryBuilder) DynamicSchemaColumn? col = item.Schema ?? (builder as DynamicQueryBuilder)
.NullOr(b => b.GetColumnFromSchema(item.ColumnName), .NullOr(b => b.GetColumnFromSchema(item.ColumnName),
builder.Tables.FirstOrDefault() builder.Tables.FirstOrDefault()
.NullOr(t => t.Schema .NullOr(t => t.Schema
@@ -679,7 +679,7 @@ namespace DynamORM
ret = (T)o; ret = (T)o;
else else
{ {
var method = typeof(T).GetMethod( MethodInfo method = typeof(T).GetMethod(
"TryParse", "TryParse",
new Type[] new Type[]
{ {
@@ -711,7 +711,7 @@ namespace DynamORM
{ {
using (IDataReader reader = command.ExecuteReader()) using (IDataReader reader = command.ExecuteReader())
{ {
var method = typeof(T).GetMethod( MethodInfo method = typeof(T).GetMethod(
"TryParse", "TryParse",
new[] new[]
{ {
@@ -733,16 +733,25 @@ namespace DynamORM
{ {
if (handler != null) if (handler != null)
ret = o.ToString().TryParseDefault<T>(defaultValue, handler); ret = o.ToString().TryParseDefault<T>(defaultValue, handler);
else if (o is IConvertible && typeof(T).GetInterfaces().Any(i => i == typeof(IConvertible)))
ret = (T)Convert.ChangeType(o, typeof(T));
else if (typeof(T) == typeof(Guid))
{
if (o.GetType() == typeof(byte[]))
ret = (T)(object)new Guid((byte[])o);
else
ret = (T)(object)Guid.Parse(o.ToString());
}
else if (typeof(T) == typeof(string))
ret = (T)(o.ToString() as object);
else if (typeof(T) == typeof(object))
ret = (T)o;
else if (method != null) else if (method != null)
ret = o.ToString().TryParseDefault<T>(defaultValue, delegate(string v, out T r) ret = o.ToString().TryParseDefault<T>(defaultValue, delegate(string v, out T r)
{ {
r = defaultValue; r = defaultValue;
return (bool)method.Invoke(null, new object[] { v, r }); return (bool)method.Invoke(null, new object[] { v, r });
}); });
else if (typeof(T) == typeof(string))
ret = (T)(o.ToString() as object);
else if (typeof(T) == typeof(object))
ret = (T)o;
else else
throw new InvalidOperationException("Provided type can't be parsed using generic approach."); throw new InvalidOperationException("Provided type can't be parsed using generic approach.");
} }
@@ -762,7 +771,7 @@ namespace DynamORM
/// <returns>Returns dumped <see cref="System.Data.IDbCommand"/> instance in string form.</returns> /// <returns>Returns dumped <see cref="System.Data.IDbCommand"/> instance in string form.</returns>
public static string DumpToString(this IDbCommand command) public static string DumpToString(this IDbCommand command)
{ {
var sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
command.Dump(sb); command.Dump(sb);
return sb.ToString(); return sb.ToString();
} }
@@ -932,7 +941,7 @@ namespace DynamORM
/// <returns>This instance to permit chaining.</returns> /// <returns>This instance to permit chaining.</returns>
public static T SubQuery<T>(this T b, Action<T, IDynamicSelectQueryBuilder> subquery) where T : IDynamicQueryBuilder public static T SubQuery<T>(this T b, Action<T, IDynamicSelectQueryBuilder> subquery) where T : IDynamicQueryBuilder
{ {
var sub = b.SubQuery(); IDynamicSelectQueryBuilder sub = b.SubQuery();
subquery(b, sub); subquery(b, sub);
@@ -950,7 +959,7 @@ namespace DynamORM
/// <returns>This instance to permit chaining.</returns> /// <returns>This instance to permit chaining.</returns>
public static T SubQuery<T>(this T b, Action<T, IDynamicSelectQueryBuilder> subquery, Func<dynamic, object> fn, params Func<dynamic, object>[] func) where T : IDynamicQueryBuilder public static T SubQuery<T>(this T b, Action<T, IDynamicSelectQueryBuilder> subquery, Func<dynamic, object> fn, params Func<dynamic, object>[] func) where T : IDynamicQueryBuilder
{ {
var sub = b.SubQuery(fn, func); IDynamicSelectQueryBuilder sub = b.SubQuery(fn, func);
subquery(b, sub); subquery(b, sub);
@@ -968,7 +977,7 @@ namespace DynamORM
/// <returns>List of things.</returns> /// <returns>List of things.</returns>
public static List<dynamic> ToList(this IDataReader r) public static List<dynamic> ToList(this IDataReader r)
{ {
var result = new List<dynamic>(); List<dynamic> result = new List<dynamic>();
while (r.Read()) while (r.Read())
result.Add(r.RowToDynamic()); result.Add(r.RowToDynamic());
@@ -981,10 +990,10 @@ namespace DynamORM
/// <returns>Converted dictionary.</returns> /// <returns>Converted dictionary.</returns>
public static dynamic ToDynamic(this IDictionary<string, object> d) public static dynamic ToDynamic(this IDictionary<string, object> d)
{ {
var result = new DynamicExpando(); DynamicExpando result = new DynamicExpando();
var dict = (IDictionary<string, object>)result; IDictionary<string, object> dict = (IDictionary<string, object>)result;
foreach (var prop in d) foreach (KeyValuePair<string, object> prop in d)
dict.Add(prop.Key, prop.Value); dict.Add(prop.Key, prop.Value);
return result; return result;
@@ -995,10 +1004,10 @@ namespace DynamORM
/// <returns>Converted dictionary.</returns> /// <returns>Converted dictionary.</returns>
public static dynamic ToExpando(this IDictionary<string, object> d) public static dynamic ToExpando(this IDictionary<string, object> d)
{ {
var result = new ExpandoObject(); ExpandoObject result = new ExpandoObject();
var dict = (IDictionary<string, object>)result; IDictionary<string, object> dict = (IDictionary<string, object>)result;
foreach (var prop in d) foreach (KeyValuePair<string, object> prop in d)
dict.Add(prop.Key, prop.Value); dict.Add(prop.Key, prop.Value);
return result; return result;
@@ -1009,13 +1018,13 @@ namespace DynamORM
/// <returns>Converted object.</returns> /// <returns>Converted object.</returns>
public static dynamic ToDynamic(this object o) public static dynamic ToDynamic(this object o)
{ {
var ot = o.GetType(); Type ot = o.GetType();
if (ot == typeof(DynamicExpando) || ot == typeof(ExpandoObject)) if (ot == typeof(DynamicExpando) || ot == typeof(ExpandoObject))
return o; return o;
var result = new DynamicExpando(); DynamicExpando result = new DynamicExpando();
var dict = (IDictionary<string, object>)result; IDictionary<string, object> dict = (IDictionary<string, object>)result;
if (o is IDictionary<string, object>) if (o is IDictionary<string, object>)
((IDictionary<string, object>)o) ((IDictionary<string, object>)o)
@@ -1023,7 +1032,7 @@ namespace DynamORM
.ForEach(kvp => dict.Add(kvp.Key, kvp.Value)); .ForEach(kvp => dict.Add(kvp.Key, kvp.Value));
else if (ot == typeof(NameValueCollection) || ot.IsSubclassOf(typeof(NameValueCollection))) else if (ot == typeof(NameValueCollection) || ot.IsSubclassOf(typeof(NameValueCollection)))
{ {
var nameValue = (NameValueCollection)o; NameValueCollection nameValue = (NameValueCollection)o;
nameValue.Cast<string>() nameValue.Cast<string>()
.Select(key => new KeyValuePair<string, object>(key, nameValue[key])) .Select(key => new KeyValuePair<string, object>(key, nameValue[key]))
.ToList() .ToList()
@@ -1031,19 +1040,19 @@ namespace DynamORM
} }
else else
{ {
var mapper = DynamicMapperCache.GetMapper(ot); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(ot);
if (mapper != null) if (mapper != null)
{ {
foreach (var item in mapper.ColumnsMap.Values) foreach (DynamicPropertyInvoker item in mapper.ColumnsMap.Values)
if (item.Get != null) if (item.Get != null)
dict.Add(item.Name, item.Get(o)); dict.Add(item.Name, item.Get(o));
} }
else else
{ {
var props = ot.GetProperties(); PropertyInfo[] props = ot.GetProperties();
foreach (var item in props) foreach (PropertyInfo item in props)
if (item.CanRead) if (item.CanRead)
dict.Add(item.Name, item.GetValue(o, null)); dict.Add(item.Name, item.GetValue(o, null));
} }
@@ -1057,13 +1066,13 @@ namespace DynamORM
/// <returns>Converted object.</returns> /// <returns>Converted object.</returns>
public static dynamic ToExpando(this object o) public static dynamic ToExpando(this object o)
{ {
var ot = o.GetType(); Type ot = o.GetType();
if (ot == typeof(ExpandoObject) || ot == typeof(DynamicExpando)) if (ot == typeof(ExpandoObject) || ot == typeof(DynamicExpando))
return o; return o;
var result = new ExpandoObject(); ExpandoObject result = new ExpandoObject();
var dict = (IDictionary<string, object>)result; IDictionary<string, object> dict = (IDictionary<string, object>)result;
if (o is IDictionary<string, object>) if (o is IDictionary<string, object>)
((IDictionary<string, object>)o) ((IDictionary<string, object>)o)
@@ -1071,7 +1080,7 @@ namespace DynamORM
.ForEach(kvp => dict.Add(kvp.Key, kvp.Value)); .ForEach(kvp => dict.Add(kvp.Key, kvp.Value));
else if (ot == typeof(NameValueCollection) || ot.IsSubclassOf(typeof(NameValueCollection))) else if (ot == typeof(NameValueCollection) || ot.IsSubclassOf(typeof(NameValueCollection)))
{ {
var nameValue = (NameValueCollection)o; NameValueCollection nameValue = (NameValueCollection)o;
nameValue.Cast<string>() nameValue.Cast<string>()
.Select(key => new KeyValuePair<string, object>(key, nameValue[key])) .Select(key => new KeyValuePair<string, object>(key, nameValue[key]))
.ToList() .ToList()
@@ -1079,19 +1088,19 @@ namespace DynamORM
} }
else else
{ {
var mapper = DynamicMapperCache.GetMapper(ot); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(ot);
if (mapper != null) if (mapper != null)
{ {
foreach (var item in mapper.ColumnsMap.Values) foreach (DynamicPropertyInvoker item in mapper.ColumnsMap.Values)
if (item.Get != null) if (item.Get != null)
dict.Add(item.Name, item.Get(o)); dict.Add(item.Name, item.Get(o));
} }
else else
{ {
var props = ot.GetProperties(); PropertyInfo[] props = ot.GetProperties();
foreach (var item in props) foreach (PropertyInfo item in props)
if (item.CanRead) if (item.CanRead)
dict.Add(item.Name, item.GetValue(o, null)); dict.Add(item.Name, item.GetValue(o, null));
} }
@@ -1179,7 +1188,7 @@ namespace DynamORM
public static dynamic RowToDynamic(this IDataReader r) public static dynamic RowToDynamic(this IDataReader r)
{ {
dynamic e = new DynamicExpando(); dynamic e = new DynamicExpando();
var d = e as IDictionary<string, object>; IDictionary<string, object> d = e as IDictionary<string, object>;
int c = r.FieldCount; int c = r.FieldCount;
for (int i = 0; i < c; i++) for (int i = 0; i < c; i++)
@@ -1202,7 +1211,7 @@ namespace DynamORM
public static dynamic RowToExpando(this IDataReader r) public static dynamic RowToExpando(this IDataReader r)
{ {
dynamic e = new ExpandoObject(); dynamic e = new ExpandoObject();
var d = e as IDictionary<string, object>; IDictionary<string, object> d = e as IDictionary<string, object>;
int c = r.FieldCount; int c = r.FieldCount;
for (int i = 0; i < c; i++) for (int i = 0; i < c; i++)
@@ -1331,7 +1340,7 @@ namespace DynamORM
/// provided <see cref="System.Data.DbType"/>.</returns> /// provided <see cref="System.Data.DbType"/>.</returns>
public static Type ToType(this DbType dbt) public static Type ToType(this DbType dbt)
{ {
foreach (var tdbt in TypeMap) foreach (KeyValuePair<Type, DbType> tdbt in TypeMap)
if (tdbt.Value == dbt) if (tdbt.Value == dbt)
return tdbt.Key; return tdbt.Key;
@@ -1414,12 +1423,12 @@ namespace DynamORM
/// <returns>Enumerator of specified type.</returns> /// <returns>Enumerator of specified type.</returns>
public static IEnumerable<T> MapEnumerable<T>(this IEnumerable<object> enumerable) public static IEnumerable<T> MapEnumerable<T>(this IEnumerable<object> enumerable)
{ {
var mapper = DynamicMapperCache.GetMapper<T>(); DynamicTypeMap mapper = DynamicMapperCache.GetMapper<T>();
if (mapper == null) if (mapper == null)
throw new InvalidOperationException("Type can't be mapped for unknown reason."); throw new InvalidOperationException("Type can't be mapped for unknown reason.");
foreach (var item in enumerable) foreach (object item in enumerable)
yield return (T)mapper.Create(item); yield return (T)mapper.Create(item);
} }
@@ -1429,7 +1438,7 @@ namespace DynamORM
/// <returns>Item of specified type.</returns> /// <returns>Item of specified type.</returns>
public static T Map<T>(this object item) public static T Map<T>(this object item)
{ {
var mapper = DynamicMapperCache.GetMapper<T>(); DynamicTypeMap mapper = DynamicMapperCache.GetMapper<T>();
if (mapper == null) if (mapper == null)
throw new InvalidOperationException("Type can't be mapped for unknown reason."); throw new InvalidOperationException("Type can't be mapped for unknown reason.");
@@ -1444,7 +1453,7 @@ namespace DynamORM
/// <returns>Filled item.</returns> /// <returns>Filled item.</returns>
public static T Fill<T>(this T item, object source) public static T Fill<T>(this T item, object source)
{ {
var mapper = DynamicMapperCache.GetMapper<T>(); DynamicTypeMap mapper = DynamicMapperCache.GetMapper<T>();
if (mapper == null) if (mapper == null)
throw new InvalidOperationException("Type can't be mapped for unknown reason."); throw new InvalidOperationException("Type can't be mapped for unknown reason.");
@@ -1460,12 +1469,12 @@ namespace DynamORM
/// <returns>Enumerator of specified type.</returns> /// <returns>Enumerator of specified type.</returns>
public static IEnumerable<object> MapEnumerable(this IEnumerable<object> enumerable, Type type) public static IEnumerable<object> MapEnumerable(this IEnumerable<object> enumerable, Type type)
{ {
var mapper = DynamicMapperCache.GetMapper(type); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
if (mapper == null) if (mapper == null)
throw new InvalidOperationException("Type can't be mapped for unknown reason."); throw new InvalidOperationException("Type can't be mapped for unknown reason.");
foreach (var item in enumerable) foreach (object item in enumerable)
yield return mapper.Create(item); yield return mapper.Create(item);
} }
@@ -1475,7 +1484,7 @@ namespace DynamORM
/// <returns>Item of specified type.</returns> /// <returns>Item of specified type.</returns>
public static object Map(this object item, Type type) public static object Map(this object item, Type type)
{ {
var mapper = DynamicMapperCache.GetMapper(type); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
if (mapper == null) if (mapper == null)
throw new InvalidOperationException("Type can't be mapped for unknown reason."); throw new InvalidOperationException("Type can't be mapped for unknown reason.");

View File

@@ -267,7 +267,7 @@ namespace DynamORM
Database = database; Database = database;
TableType = type; TableType = type;
var mapper = DynamicMapperCache.GetMapper(type); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(type);
if (mapper != null) if (mapper != null)
{ {
@@ -293,11 +293,11 @@ namespace DynamORM
if (keys == null && TableType != null) if (keys == null && TableType != null)
{ {
var mapper = DynamicMapperCache.GetMapper(TableType); DynamicTypeMap mapper = DynamicMapperCache.GetMapper(TableType);
if (mapper != null) if (mapper != null)
{ {
var k = mapper.ColumnsMap.Where(p => p.Value.Column != null && p.Value.Column.IsKey).Select(p => p.Key); IEnumerable<string> k = mapper.ColumnsMap.Where(p => p.Value.Column != null && p.Value.Column.IsKey).Select(p => p.Key);
if (k.Count() > 0) if (k.Count() > 0)
keys = k.ToArray(); keys = k.ToArray();
} }
@@ -361,9 +361,9 @@ namespace DynamORM
/// <returns>New <see cref="DynamicSelectQueryBuilder"/> instance.</returns> /// <returns>New <see cref="DynamicSelectQueryBuilder"/> instance.</returns>
public virtual IDynamicSelectQueryBuilder Query() public virtual IDynamicSelectQueryBuilder Query()
{ {
var builder = new DynamicSelectQueryBuilder(this.Database); IDynamicSelectQueryBuilder builder = new DynamicSelectQueryBuilder(this.Database);
var name = this.FullName; string name = this.FullName;
if (!string.IsNullOrEmpty(name)) if (!string.IsNullOrEmpty(name))
builder.From(x => name); builder.From(x => name);
@@ -575,16 +575,16 @@ namespace DynamORM
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{ {
// parse the method // parse the method
var info = binder.CallInfo; CallInfo info = binder.CallInfo;
// Get generic types // Get generic types
var types = binder.GetGenericTypeArguments(); IList<Type> types = binder.GetGenericTypeArguments();
// accepting named args only... SKEET! // accepting named args only... SKEET!
if (info.ArgumentNames.Count != args.Length) if (info.ArgumentNames.Count != args.Length)
throw new InvalidOperationException("Please use named arguments for this type of query - the column name, orderby, columns, etc"); throw new InvalidOperationException("Please use named arguments for this type of query - the column name, orderby, columns, etc");
var op = binder.Name; string op = binder.Name;
// Avoid strange things // Avoid strange things
if (!_allowedCommands.Contains(op)) if (!_allowedCommands.Contains(op))
@@ -614,7 +614,7 @@ namespace DynamORM
private object DynamicInsert(object[] args, CallInfo info, IList<Type> types) private object DynamicInsert(object[] args, CallInfo info, IList<Type> types)
{ {
var builder = new DynamicInsertQueryBuilder(this.Database); DynamicInsertQueryBuilder builder = new DynamicInsertQueryBuilder(this.Database);
if (types != null && types.Count == 1) if (types != null && types.Count == 1)
HandleTypeArgument<DynamicInsertQueryBuilder>(null, info, ref types, builder, 0); HandleTypeArgument<DynamicInsertQueryBuilder>(null, info, ref types, builder, 0);
@@ -627,8 +627,8 @@ namespace DynamORM
{ {
for (int i = 0; i < args.Length; i++) for (int i = 0; i < args.Length; i++)
{ {
var fullName = info.ArgumentNames[i]; string fullName = info.ArgumentNames[i];
var name = fullName.ToLower(); string name = fullName.ToLower();
switch (name) switch (name)
{ {
@@ -661,7 +661,7 @@ namespace DynamORM
private object DynamicUpdate(object[] args, CallInfo info, IList<Type> types) private object DynamicUpdate(object[] args, CallInfo info, IList<Type> types)
{ {
var builder = new DynamicUpdateQueryBuilder(this.Database); DynamicUpdateQueryBuilder builder = new DynamicUpdateQueryBuilder(this.Database);
if (types != null && types.Count == 1) if (types != null && types.Count == 1)
HandleTypeArgument<DynamicUpdateQueryBuilder>(null, info, ref types, builder, 0); HandleTypeArgument<DynamicUpdateQueryBuilder>(null, info, ref types, builder, 0);
@@ -674,8 +674,8 @@ namespace DynamORM
{ {
for (int i = 0; i < args.Length; i++) for (int i = 0; i < args.Length; i++)
{ {
var fullName = info.ArgumentNames[i]; string fullName = info.ArgumentNames[i];
var name = fullName.ToLower(); string name = fullName.ToLower();
switch (name) switch (name)
{ {
@@ -716,7 +716,7 @@ namespace DynamORM
private object DynamicDelete(object[] args, CallInfo info, IList<Type> types) private object DynamicDelete(object[] args, CallInfo info, IList<Type> types)
{ {
var builder = new DynamicDeleteQueryBuilder(this.Database); DynamicDeleteQueryBuilder builder = new DynamicDeleteQueryBuilder(this.Database);
if (types != null && types.Count == 1) if (types != null && types.Count == 1)
HandleTypeArgument<DynamicDeleteQueryBuilder>(null, info, ref types, builder, 0); HandleTypeArgument<DynamicDeleteQueryBuilder>(null, info, ref types, builder, 0);
@@ -729,8 +729,8 @@ namespace DynamORM
{ {
for (int i = 0; i < args.Length; i++) for (int i = 0; i < args.Length; i++)
{ {
var fullName = info.ArgumentNames[i]; string fullName = info.ArgumentNames[i];
var name = fullName.ToLower(); string name = fullName.ToLower();
switch (name) switch (name)
{ {
@@ -768,7 +768,7 @@ namespace DynamORM
private object DynamicQuery(object[] args, CallInfo info, string op, IList<Type> types) private object DynamicQuery(object[] args, CallInfo info, string op, IList<Type> types)
{ {
object result; object result;
var builder = new DynamicSelectQueryBuilder(this.Database); DynamicSelectQueryBuilder builder = new DynamicSelectQueryBuilder(this.Database);
if (types != null && types.Count == 1) if (types != null && types.Count == 1)
HandleTypeArgument<DynamicSelectQueryBuilder>(null, info, ref types, builder, 0); HandleTypeArgument<DynamicSelectQueryBuilder>(null, info, ref types, builder, 0);
@@ -781,8 +781,8 @@ namespace DynamORM
{ {
for (int i = 0; i < args.Length; i++) for (int i = 0; i < args.Length; i++)
{ {
var fullName = info.ArgumentNames[i]; string fullName = info.ArgumentNames[i];
var name = fullName.ToLower(); string name = fullName.ToLower();
// TODO: Make this nicer // TODO: Make this nicer
switch (name) switch (name)
@@ -813,14 +813,14 @@ namespace DynamORM
case "columns": case "columns":
{ {
var agregate = (op == "Sum" || op == "Max" || op == "Min" || op == "Avg" || op == "Count") ? string agregate = (op == "Sum" || op == "Max" || op == "Min" || op == "Avg" || op == "Count") ?
op.ToUpper() : null; op.ToUpper() : null;
if (args[i] is string || args[i] is string[]) if (args[i] is string || args[i] is string[])
builder.SelectColumn((args[i] as String).NullOr(s => s.Split(','), args[i] as String[]) builder.SelectColumn((args[i] as String).NullOr(s => s.Split(','), args[i] as String[])
.Select(c => .Select(c =>
{ {
var col = DynamicColumn.ParseSelectColumn(c); DynamicColumn col = DynamicColumn.ParseSelectColumn(c);
if (string.IsNullOrEmpty(col.Aggregate)) if (string.IsNullOrEmpty(col.Aggregate))
col.Aggregate = agregate; col.Aggregate = agregate;
@@ -886,17 +886,9 @@ namespace DynamORM
else else
{ {
// build the SQL // build the SQL
var justOne = op == "First" || op == "Last" || op == "Get" || op == "Single"; bool justOne = op == "First" || op == "Last" || op == "Get" || op == "Single";
// Be sure to sort by DESC on selected columns // Be sure to sort by DESC on selected columns
/*if (op == "Last")
{
if (builder.Order.Count > 0)
foreach (var o in builder.Order)
o.Order = o.Order == DynamicColumn.SortOrder.Desc ?
DynamicColumn.SortOrder.Asc : DynamicColumn.SortOrder.Desc;
}*/
if (justOne && !(op == "Last")) if (justOne && !(op == "Last"))
{ {
if ((Database.Options & DynamicDatabaseOptions.SupportLimitOffset) == DynamicDatabaseOptions.SupportLimitOffset) if ((Database.Options & DynamicDatabaseOptions.SupportLimitOffset) == DynamicDatabaseOptions.SupportLimitOffset)

View File

@@ -27,8 +27,11 @@
*/ */
using System; using System;
using System.Collections;
using System.Collections.Generic;
using System.Data; using System.Data;
using System.Linq; using System.Linq;
using System.Reflection;
using DynamORM.Helpers; using DynamORM.Helpers;
namespace DynamORM namespace DynamORM
@@ -66,7 +69,7 @@ namespace DynamORM
{ {
if (customParams != null) if (customParams != null)
{ {
var mi = _con.Connection.GetType().GetMethods().Where(m => m.GetParameters().Count() == 1 && m.GetParameters().First().ParameterType == customParams.GetType()).FirstOrDefault(); MethodInfo mi = _con.Connection.GetType().GetMethods().Where(m => m.GetParameters().Count() == 1 && m.GetParameters().First().ParameterType == customParams.GetType()).FirstOrDefault();
if (mi != null) if (mi != null)
_db.TransactionPool[_con.Connection].Push((IDbTransaction)mi.Invoke(_con.Connection, new object[] { customParams, })); _db.TransactionPool[_con.Connection].Push((IDbTransaction)mi.Invoke(_con.Connection, new object[] { customParams, }));
else else
@@ -90,7 +93,7 @@ namespace DynamORM
{ {
if (_operational) if (_operational)
{ {
var t = _db.TransactionPool.TryGetValue(_con.Connection); Stack<IDbTransaction> t = _db.TransactionPool.TryGetValue(_con.Connection);
if (t != null && t.Count > 0) if (t != null && t.Count > 0)
{ {
@@ -114,7 +117,7 @@ namespace DynamORM
{ {
if (_operational) if (_operational)
{ {
var t = _db.TransactionPool.TryGetValue(_con.Connection); Stack<IDbTransaction> t = _db.TransactionPool.TryGetValue(_con.Connection);
if (t != null && t.Count > 0) if (t != null && t.Count > 0)
{ {

View File

@@ -91,13 +91,13 @@ namespace DynamORM.Helpers
int firstCount; int firstCount;
int secondCount; int secondCount;
var firstElementCounts = GetElementCounts(first, out firstCount); Dictionary<T, int> firstElementCounts = GetElementCounts(first, out firstCount);
var secondElementCounts = GetElementCounts(second, out secondCount); Dictionary<T, int> secondElementCounts = GetElementCounts(second, out secondCount);
if (firstCount != secondCount) if (firstCount != secondCount)
return true; return true;
foreach (var kvp in firstElementCounts) foreach (KeyValuePair<T, int> kvp in firstElementCounts)
if (kvp.Value != (secondElementCounts.TryGetNullable(kvp.Key) ?? 0)) if (kvp.Value != (secondElementCounts.TryGetNullable(kvp.Key) ?? 0))
return true; return true;
@@ -106,7 +106,7 @@ namespace DynamORM.Helpers
private static Dictionary<T, int> GetElementCounts(IEnumerable<T> enumerable, out int nullCount) private static Dictionary<T, int> GetElementCounts(IEnumerable<T> enumerable, out int nullCount)
{ {
var dictionary = new Dictionary<T, int>(); Dictionary<T, int> dictionary = new Dictionary<T, int>();
nullCount = 0; nullCount = 0;
foreach (T element in enumerable) foreach (T element in enumerable)

View File

@@ -33,6 +33,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Dynamic; using System.Dynamic;
using System.Linq.Expressions; using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.Serialization; using System.Runtime.Serialization;
using System.Text; using System.Text;
@@ -77,12 +78,12 @@ namespace DynamORM.Helpers.Dynamics
// Func was cool but caused memory leaks // Func was cool but caused memory leaks
private DynamicMetaObject GetBinder(Node node) private DynamicMetaObject GetBinder(Node node)
{ {
var o = (Node)this.Value; Node o = (Node)this.Value;
node.Parser = o.Parser; node.Parser = o.Parser;
o.Parser.Last = node; o.Parser.Last = node;
var p = Expression.Variable(typeof(Node), "ret"); ParameterExpression p = Expression.Variable(typeof(Node), "ret");
var exp = Expression.Block(new ParameterExpression[] { p }, Expression.Assign(p, Expression.Constant(node))); BlockExpression exp = Expression.Block(new ParameterExpression[] { p }, Expression.Assign(p, Expression.Constant(node)));
return new MetaNode(exp, this.Restrictions, node); return new MetaNode(exp, this.Restrictions, node);
} }
@@ -187,8 +188,8 @@ namespace DynamORM.Helpers.Dynamics
/// </returns> /// </returns>
public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder) public override DynamicMetaObject BindUnaryOperation(UnaryOperationBinder binder)
{ {
var o = (Node)this.Value; Node o = (Node)this.Value;
var node = new Unary(o, binder.Operation) { Parser = o.Parser }; Unary node = new Unary(o, binder.Operation) { Parser = o.Parser };
o.Parser.Last = node; o.Parser.Last = node;
// If operation is 'IsTrue' or 'IsFalse', we will return false to keep the engine working... // If operation is 'IsTrue' or 'IsFalse', we will return false to keep the engine working...
@@ -196,8 +197,8 @@ namespace DynamORM.Helpers.Dynamics
if (binder.Operation == ExpressionType.IsTrue) ret = (object)false; if (binder.Operation == ExpressionType.IsTrue) ret = (object)false;
if (binder.Operation == ExpressionType.IsFalse) ret = (object)false; if (binder.Operation == ExpressionType.IsFalse) ret = (object)false;
var p = Expression.Variable(ret.GetType(), "ret"); // the type is now obtained from "ret" ParameterExpression p = Expression.Variable(ret.GetType(), "ret"); // the type is now obtained from "ret"
var exp = Expression.Block( BlockExpression exp = Expression.Block(
new ParameterExpression[] { p }, new ParameterExpression[] { p },
Expression.Assign(p, Expression.Constant(ret))); // the expression is now obtained from "ret" Expression.Assign(p, Expression.Constant(ret))); // the expression is now obtained from "ret"
@@ -213,8 +214,8 @@ namespace DynamORM.Helpers.Dynamics
/// </returns> /// </returns>
public override DynamicMetaObject BindConvert(ConvertBinder binder) public override DynamicMetaObject BindConvert(ConvertBinder binder)
{ {
var o = (Node)this.Value; Node o = (Node)this.Value;
var node = new Convert(o, binder.ReturnType) { Parser = o.Parser }; Convert node = new Convert(o, binder.ReturnType) { Parser = o.Parser };
o.Parser.Last = node; o.Parser.Last = node;
// Reducing the object to return if this is an assignment node... // Reducing the object to return if this is an assignment node...
@@ -249,8 +250,8 @@ namespace DynamORM.Helpers.Dynamics
} }
} }
var p = Expression.Variable(binder.ReturnType, "ret"); ParameterExpression p = Expression.Variable(binder.ReturnType, "ret");
var exp = Expression.Block( BlockExpression exp = Expression.Block(
new ParameterExpression[] { p }, new ParameterExpression[] { p },
Expression.Assign(p, Expression.Constant(ret, binder.ReturnType))); // specifying binder.ReturnType Expression.Assign(p, Expression.Constant(ret, binder.ReturnType))); // specifying binder.ReturnType
@@ -1102,7 +1103,7 @@ namespace DynamORM.Helpers.Dynamics
if (!IsDisposed && _arguments != null) if (!IsDisposed && _arguments != null)
list.AddRange(_arguments); list.AddRange(_arguments);
foreach (var arg in list) foreach (Node.Argument arg in list)
yield return arg; yield return arg;
list.Clear(); list.Clear();
@@ -1134,13 +1135,13 @@ namespace DynamORM.Helpers.Dynamics
{ {
// I know this can be almost a one liner // I know this can be almost a one liner
// but it causes memory leaks when so. // but it causes memory leaks when so.
var pars = f.Method.GetParameters(); ParameterInfo[] pars = f.Method.GetParameters();
foreach (var p in pars) foreach (ParameterInfo p in pars)
{ {
var attrs = p.GetCustomAttributes(typeof(DynamicAttribute), true).Length; int attrs = p.GetCustomAttributes(typeof(DynamicAttribute), true).Length;
if (attrs != 0) if (attrs != 0)
{ {
var par = new Node.Argument(p.Name) { Parser = this }; Node.Argument par = new Node.Argument(p.Name) { Parser = this };
this._arguments.Add(par); this._arguments.Add(par);
} }
else else
@@ -1176,7 +1177,7 @@ namespace DynamORM.Helpers.Dynamics
if (_arguments != null) if (_arguments != null)
{ {
foreach (var arg in _arguments) foreach (Node.Argument arg in _arguments)
{ {
if (!first) sb.Append(", "); else first = false; if (!first) sb.Append(", "); else first = false;
sb.Append(arg); sb.Append(arg);

View File

@@ -59,7 +59,7 @@ namespace DynamORM.Helpers.Dynamics
_proxy = proxiedObject; _proxy = proxiedObject;
_type = typeof(T); _type = typeof(T);
var mapper = Mapper.DynamicMapperCache.GetMapper<T>(); DynamicTypeMap mapper = Mapper.DynamicMapperCache.GetMapper<T>();
_properties = mapper _properties = mapper
.ColumnsMap .ColumnsMap
@@ -146,7 +146,7 @@ namespace DynamORM.Helpers.Dynamics
{ {
try try
{ {
var prop = _properties.TryGetValue(binder.Name); DynamicPropertyInvoker prop = _properties.TryGetValue(binder.Name);
result = prop.NullOr(p => p.Get.NullOr(g => g(_proxy), null), null); result = prop.NullOr(p => p.Get.NullOr(g => g(_proxy), null), null);
@@ -181,7 +181,7 @@ namespace DynamORM.Helpers.Dynamics
{ {
try try
{ {
var prop = _properties.TryGetValue(binder.Name); DynamicPropertyInvoker prop = _properties.TryGetValue(binder.Name);
if (prop != null && prop.Setter != null) if (prop != null && prop.Setter != null)
{ {
@@ -278,18 +278,17 @@ namespace DynamORM.Helpers.Dynamics
{ {
if (type.IsInterface) if (type.IsInterface)
{ {
var members = new List<MemberInfo>(); List<MemberInfo> members = new List<MemberInfo>();
List<Type> considered = new List<Type>();
var considered = new List<Type>(); Queue<Type> queue = new Queue<Type>();
var queue = new Queue<Type>();
considered.Add(type); considered.Add(type);
queue.Enqueue(type); queue.Enqueue(type);
while (queue.Count > 0) while (queue.Count > 0)
{ {
var subType = queue.Dequeue(); Type subType = queue.Dequeue();
foreach (var subInterface in subType.GetInterfaces()) foreach (Type subInterface in subType.GetInterfaces())
{ {
if (considered.Contains(subInterface)) continue; if (considered.Contains(subInterface)) continue;
@@ -297,12 +296,12 @@ namespace DynamORM.Helpers.Dynamics
queue.Enqueue(subInterface); queue.Enqueue(subInterface);
} }
var typeProperties = subType.GetMembers( MemberInfo[] typeProperties = subType.GetMembers(
BindingFlags.FlattenHierarchy BindingFlags.FlattenHierarchy
| BindingFlags.Public | BindingFlags.Public
| BindingFlags.Instance); | BindingFlags.Instance);
var newPropertyInfos = typeProperties IEnumerable<MemberInfo> newPropertyInfos = typeProperties
.Where(x => !members.Contains(x)); .Where(x => !members.Contains(x));
members.InsertRange(0, newPropertyInfos); members.InsertRange(0, newPropertyInfos);

View File

@@ -61,7 +61,7 @@ namespace DynamORM.Helpers
// HACK: Creating binders assuming types are correct... this may fail. // HACK: Creating binders assuming types are correct... this may fail.
if (IsMono) if (IsMono)
{ {
var binderType = typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.GetType("Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder"); Type binderType = typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.GetType("Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder");
if (binderType != null) if (binderType != null)
{ {
@@ -76,16 +76,16 @@ namespace DynamORM.Helpers
} }
else else
{ {
var inter = typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.GetType("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder"); Type inter = typeof(Microsoft.CSharp.RuntimeBinder.RuntimeBinderException).Assembly.GetType("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder");
if (inter != null) if (inter != null)
{ {
var prop = inter.GetProperty("TypeArguments"); PropertyInfo prop = inter.GetProperty("TypeArguments");
if (!prop.CanRead) if (!prop.CanRead)
return null; return null;
var objParm = Expression.Parameter(typeof(InvokeMemberBinder), "o"); ParameterExpression objParm = Expression.Parameter(typeof(InvokeMemberBinder), "o");
return Expression.Lambda<Func<InvokeMemberBinder, IList<Type>>>( return Expression.Lambda<Func<InvokeMemberBinder, IList<Type>>>(
Expression.TypeAs( Expression.TypeAs(
@@ -121,7 +121,7 @@ namespace DynamORM.Helpers
// In mono this is trivial. // In mono this is trivial.
// First we get field info. // First we get field info.
var field = binder.GetType().GetField("typeArguments", BindingFlags.Instance | FieldInfo field = binder.GetType().GetField("typeArguments", BindingFlags.Instance |
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
// If this was a success get and return it's value // If this was a success get and return it's value
@@ -134,12 +134,12 @@ namespace DynamORM.Helpers
// In this case, we need more aerobic :D // In this case, we need more aerobic :D
// First, get the interface // First, get the interface
var inter = binder.GetType().GetInterface("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder"); Type inter = binder.GetType().GetInterface("Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder");
if (inter != null) if (inter != null)
{ {
// Now get property. // Now get property.
var prop = inter.GetProperty("TypeArguments"); PropertyInfo prop = inter.GetProperty("TypeArguments");
// If we have a property, return it's value // If we have a property, return it's value
if (prop != null) if (prop != null)

View File

@@ -146,7 +146,7 @@ namespace DynamORM.Helpers
if (props.Length != 0) if (props.Length != 0)
{ {
foreach (var prop in props) foreach (PropertyInfo prop in props)
{ {
if (!first) sb.Append(", "); else first = false; if (!first) sb.Append(", "); else first = false;
sb.AppendFormat("{0}='{1}'", prop.Name, prop.GetValue(obj, null).Sketch()); sb.AppendFormat("{0}='{1}'", prop.Name, prop.GetValue(obj, null).Sketch());
@@ -156,7 +156,7 @@ namespace DynamORM.Helpers
{ {
if (infos.Length != 0) if (infos.Length != 0)
{ {
foreach (var info in infos) foreach (FieldInfo info in infos)
{ {
if (!first) sb.Append(", "); else first = false; if (!first) sb.Append(", "); else first = false;
sb.AppendFormat("{0}='{1}'", info.Name, info.GetValue(obj).Sketch()); sb.AppendFormat("{0}='{1}'", info.Name, info.GetValue(obj).Sketch());

View File

@@ -71,7 +71,7 @@ namespace DynamORM.Mapper
Name = property.Name; Name = property.Name;
Type = property.PropertyType; Type = property.PropertyType;
var ignore = property.GetCustomAttributes(typeof(IgnoreAttribute), false); object[] ignore = property.GetCustomAttributes(typeof(IgnoreAttribute), false);
Ignore = ignore != null && ignore.Length > 0; Ignore = ignore != null && ignore.Length > 0;
@@ -89,7 +89,7 @@ namespace DynamORM.Mapper
if (!property.CanRead) if (!property.CanRead)
return null; return null;
var objParm = Expression.Parameter(typeof(object), "o"); ParameterExpression objParm = Expression.Parameter(typeof(object), "o");
return Expression.Lambda<Func<object, object>>( return Expression.Lambda<Func<object, object>>(
Expression.Convert( Expression.Convert(
@@ -104,8 +104,8 @@ namespace DynamORM.Mapper
if (!property.CanWrite) if (!property.CanWrite)
return null; return null;
var objParm = Expression.Parameter(typeof(object), "o"); ParameterExpression objParm = Expression.Parameter(typeof(object), "o");
var valueParm = Expression.Parameter(typeof(object), "value"); ParameterExpression valueParm = Expression.Parameter(typeof(object), "value");
return Expression.Lambda<Action<object, object>>( return Expression.Lambda<Action<object, object>>(
Expression.Assign( Expression.Assign(

View File

@@ -63,7 +63,7 @@ namespace DynamORM.Mapper
{ {
Type = type; Type = type;
var attr = type.GetCustomAttributes(typeof(TableAttribute), false); object[] attr = type.GetCustomAttributes(typeof(TableAttribute), false);
if (attr != null && attr.Length > 0) if (attr != null && attr.Length > 0)
Table = (TableAttribute)attr[0]; Table = (TableAttribute)attr[0];
@@ -74,22 +74,22 @@ namespace DynamORM.Mapper
private void CreateColumnAndPropertyMap() private void CreateColumnAndPropertyMap()
{ {
var columnMap = new Dictionary<string, DynamicPropertyInvoker>(); Dictionary<string, DynamicPropertyInvoker> columnMap = new Dictionary<string, DynamicPropertyInvoker>();
var propertyMap = new Dictionary<string, string>(); Dictionary<string, string> propertyMap = new Dictionary<string, string>();
var ignored = new List<string>(); List<string> ignored = new List<string>();
foreach (var pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast<PropertyInfo>()) foreach (PropertyInfo pi in GetAllMembers(Type).Where(x => x is PropertyInfo).Cast<PropertyInfo>())
{ {
ColumnAttribute attr = null; ColumnAttribute attr = null;
var attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true); object[] attrs = pi.GetCustomAttributes(typeof(ColumnAttribute), true);
if (attrs != null && attrs.Length > 0) if (attrs != null && attrs.Length > 0)
attr = (ColumnAttribute)attrs[0]; attr = (ColumnAttribute)attrs[0];
string col = attr == null || string.IsNullOrEmpty(attr.Name) ? pi.Name : attr.Name; string col = attr == null || string.IsNullOrEmpty(attr.Name) ? pi.Name : attr.Name;
var val = new DynamicPropertyInvoker(pi, attr); DynamicPropertyInvoker val = new DynamicPropertyInvoker(pi, attr);
columnMap.Add(col.ToLower(), val); columnMap.Add(col.ToLower(), val);
propertyMap.Add(pi.Name, col); propertyMap.Add(pi.Name, col);
@@ -128,7 +128,7 @@ namespace DynamORM.Mapper
{ {
DynamicPropertyInvoker dpi = null; DynamicPropertyInvoker dpi = null;
foreach (var item in source.ToDictionary()) foreach (KeyValuePair<string, object> item in source.ToDictionary())
{ {
if (ColumnsMap.TryGetValue(item.Key.ToLower(), out dpi) && item.Value != null) if (ColumnsMap.TryGetValue(item.Key.ToLower(), out dpi) && item.Value != null)
if (dpi.Setter != null) if (dpi.Setter != null)
@@ -142,18 +142,17 @@ namespace DynamORM.Mapper
{ {
if (type.IsInterface) if (type.IsInterface)
{ {
var members = new List<MemberInfo>(); List<MemberInfo> members = new List<MemberInfo>();
List<Type> considered = new List<Type>();
var considered = new List<Type>(); Queue<Type> queue = new Queue<Type>();
var queue = new Queue<Type>();
considered.Add(type); considered.Add(type);
queue.Enqueue(type); queue.Enqueue(type);
while (queue.Count > 0) while (queue.Count > 0)
{ {
var subType = queue.Dequeue(); Type subType = queue.Dequeue();
foreach (var subInterface in subType.GetInterfaces()) foreach (Type subInterface in subType.GetInterfaces())
{ {
if (considered.Contains(subInterface)) continue; if (considered.Contains(subInterface)) continue;
@@ -161,12 +160,12 @@ namespace DynamORM.Mapper
queue.Enqueue(subInterface); queue.Enqueue(subInterface);
} }
var typeProperties = subType.GetMembers( MemberInfo[] typeProperties = subType.GetMembers(
BindingFlags.FlattenHierarchy BindingFlags.FlattenHierarchy
| BindingFlags.Public | BindingFlags.Public
| BindingFlags.Instance); | BindingFlags.Instance);
var newPropertyInfos = typeProperties IEnumerable<MemberInfo> newPropertyInfos = typeProperties
.Where(x => !members.Contains(x)); .Where(x => !members.Contains(x));
members.InsertRange(0, newPropertyInfos); members.InsertRange(0, newPropertyInfos);