From d135ab1ba07d1aabfce6b3b1bb60a62744864c63 Mon Sep 17 00:00:00 2001 From: "grzegorz.russek" Date: Tue, 14 Aug 2012 13:35:47 +0000 Subject: [PATCH] --- .../Builders/DynamicDeleteQueryBuilder.cs | 3 +- .../Builders/DynamicInsertQueryBuilder.cs | 2 +- DynamORM/DynamORM.csproj | 2 + DynamORM/DynamicCommand.cs | 48 +++++++++++++++--- DynamORM/DynamicDatabase.cs | 22 ++++++++- DynamORM/DynamicExtensions.cs | 49 ++++++++++--------- 6 files changed, 94 insertions(+), 32 deletions(-) diff --git a/DynamORM/Builders/DynamicDeleteQueryBuilder.cs b/DynamORM/Builders/DynamicDeleteQueryBuilder.cs index 741a1b1..68b9315 100644 --- a/DynamORM/Builders/DynamicDeleteQueryBuilder.cs +++ b/DynamORM/Builders/DynamicDeleteQueryBuilder.cs @@ -48,7 +48,8 @@ namespace DynamORM.Builders { StringBuilder sb = new StringBuilder(); - sb.AppendFormat("DELETE FROM {0}", TableName); + sb.Append("DELETE FROM "); + DynamicTable.Database.DecorateName(sb, TableName); FillWhere(command, sb); diff --git a/DynamORM/Builders/DynamicInsertQueryBuilder.cs b/DynamORM/Builders/DynamicInsertQueryBuilder.cs index f6d0f61..c76e550 100644 --- a/DynamORM/Builders/DynamicInsertQueryBuilder.cs +++ b/DynamORM/Builders/DynamicInsertQueryBuilder.cs @@ -179,7 +179,7 @@ namespace DynamORM.Builders first = false; } - return command.SetCommand("INSERT INTO {0} ({1}) VALUES ({2})", TableName, builderColumns, builderValues); + return command.SetCommand("INSERT INTO {0} ({1}) VALUES ({2})", db.DecorateName(TableName), builderColumns, builderValues); } /// Execute this builder. diff --git a/DynamORM/DynamORM.csproj b/DynamORM/DynamORM.csproj index db0747e..7bd6eb7 100644 --- a/DynamORM/DynamORM.csproj +++ b/DynamORM/DynamORM.csproj @@ -10,7 +10,9 @@ Properties DynamORM DynamORM + v4.0 512 + true diff --git a/DynamORM/DynamicCommand.cs b/DynamORM/DynamicCommand.cs index 80b6609..674d823 100644 --- a/DynamORM/DynamicCommand.cs +++ b/DynamORM/DynamicCommand.cs @@ -51,7 +51,7 @@ namespace DynamORM lock (_db.SyncLock) { if (!_db.CommandsPool.ContainsKey(_con.Connection)) - throw new InvalidOperationException("Can't create transaction using disposed connection."); + throw new InvalidOperationException("Can't create command using disposed connection."); else { _command = _con.Connection.CreateCommand(); @@ -60,16 +60,28 @@ namespace DynamORM } } + /// Initializes a new instance of the class. + /// The databas manager. + /// Used intenaly to create command without context. + internal DynamicCommand(DynamicDatabase db) + { + _db = db; + _command = db.Provider.CreateCommand(); + } + /// Prepare command for execution. /// Returns edited instance. - private IDbCommand PrepareForExecution() + internal IDbCommand PrepareForExecution() { - if (_poolStamp < _db.PoolStamp) + // TODO: Fix that + // if (_poolStamp < _db.PoolStamp) { _command.CommandTimeout = _commandTimeout ?? _db.CommandTimeout ?? _command.CommandTimeout; if (_db.TransactionPool[_command.Connection].Count > 0) _command.Transaction = _db.TransactionPool[_command.Connection].Peek(); + else + _command.Transaction = null; _poolStamp = _db.PoolStamp; } @@ -106,7 +118,26 @@ namespace DynamORM /// Gets or sets the /// used by this instance of the . /// The connection to the data source. - public IDbConnection Connection { get { return _con; } set { _con = (DynamicConnection)value; } } + public IDbConnection Connection + { + get { return _con; } + + set + { + _con = value as DynamicConnection; + + if (_con != null) + { + _poolStamp = 0; + _command.Connection = _con.Connection; + } + else + { + _command.Transaction = null; + _command.Connection = null; + } + } + } /// Creates a new instance of an /// object. @@ -191,10 +222,13 @@ namespace DynamORM { lock (_db.SyncLock) { - var pool = _db.CommandsPool.TryGetValue(_con.Connection); + if (_con != null) + { + var pool = _db.CommandsPool.TryGetValue(_con.Connection); - if (pool != null) - pool.Remove(_command); + if (pool != null && pool.Contains(_command)) + pool.Remove(_command); + } _command.Dispose(); } diff --git a/DynamORM/DynamicDatabase.cs b/DynamORM/DynamicDatabase.cs index 782a74e..1a0b2f9 100644 --- a/DynamORM/DynamicDatabase.cs +++ b/DynamORM/DynamicDatabase.cs @@ -59,7 +59,24 @@ namespace DynamORM /// Gets or sets timestamp of last transaction pool or configuration change. /// This property is used to allow commands to determine if /// they need to update transaction object or not. - internal long PoolStamp { get { return _poolStamp; } set { lock (SyncLock) _poolStamp = value; } } + internal long PoolStamp + { + get + { + long r = 0; + + lock (SyncLock) + r = _poolStamp; + + return r; + } + + set + { + lock (SyncLock) + _poolStamp = value; + } + } /// Gets pool of connections and transactions. internal Dictionary> TransactionPool { get; private set; } @@ -83,6 +100,9 @@ namespace DynamORM /// Gets or sets command timeout. public int? CommandTimeout { get { return _commandTimeout; } set { _commandTimeout = value; _poolStamp = DateTime.Now.Ticks; } } + /// Gets the database provider. + public DbProviderFactory Provider { get { return _provider; } } + /// Gets or sets a value indicating whether /// dump commands to console or not. public bool DumpCommands { get; set; } diff --git a/DynamORM/DynamicExtensions.cs b/DynamORM/DynamicExtensions.cs index 612f29c..93a88e0 100644 --- a/DynamORM/DynamicExtensions.cs +++ b/DynamORM/DynamicExtensions.cs @@ -255,33 +255,34 @@ namespace DynamORM var p = cmd.CreateParameter(); p.ParameterName = builder.DynamicTable.Database.GetParameterName(cmd.Parameters.Count); - if (item.Value == null) - p.Value = DBNull.Value; - else + var col = builder.Schema.TryGetNullable(item.ColumnName.ToLower()); + + if (col.HasValue) { - var col = builder.Schema.TryGetNullable(item.ColumnName.ToLower()); + p.DbType = col.Value.Type; - if (col.HasValue) + if (builder.SupportSchema) { - p.DbType = col.Value.Type; + p.Size = col.Value.Size; + p.Precision = col.Value.Precision; + p.Scale = col.Value.Scale; - if (builder.SupportSchema) - { - p.Size = col.Value.Size; - p.Precision = col.Value.Precision; - p.Scale = col.Value.Scale; - } - } - else - { - p.DbType = TypeMap.TryGetNullable(item.Value.GetType()) ?? DbType.String; - - if (p.DbType == DbType.String) - p.Size = item.Value.ToString().Length > 4000 ? -1 : 4000; + // Quick fix - review that + if (p.Scale > p.Precision) + p.Scale = 4; } p.Value = item.Value; } + else if (item.Value == null || item.Value == DBNull.Value) + p.Value = DBNull.Value; + else + { + p.DbType = TypeMap.TryGetNullable(item.Value.GetType()) ?? DbType.String; + + if (p.DbType == DbType.String) + p.Size = item.Value.ToString().Length > 4000 ? -1 : 4000; + } cmd.Parameters.Add(p); @@ -666,12 +667,16 @@ namespace DynamORM if (command.Parameters.Count > 0) { - writer.Write("Parameters:"); + writer.WriteLine("Parameters:"); foreach (IDbDataParameter param in command.Parameters) { - writer.Write(" '{0}'({1}) = '{2}'({3});", - param.ParameterName, param.DbType, + writer.WriteLine(" '{0}' ({1} (s:{2} p:{3} s:{4})) = '{5}' ({6});", + param.ParameterName, + param.DbType, + param.Scale, + param.Precision, + param.Scale, param.Value ?? "NULL", param.Value != null ? param.Value.GetType().Name : "DBNull"); }