示例#1
0
        internal static Guid Save(Delivery delivery)
        {
            using (var client = DeliveryDBClient.Connect())
            {
                Guid guid = delivery.Guid;

                if (guid != Guid.Empty)
                {
                    // refer here for an explanation on what's going on:
                    // http://stackoverflow.com/questions/5848990/retrieve-an-object-in-one-db4o-session-store-in-another-disconnected-scenario

                    // Get an inactive reference, get its temp ID and bind the supplied object to it instead
                    Delivery inactiveReference = DeliveryDB.Get(delivery.Guid, false, client);
                    if (inactiveReference != null)
                    {
                        long tempDb4oID = client.Ext().GetID(inactiveReference);
                        client.Ext().Bind(delivery, tempDb4oID);
                    }
                }
                else
                {
                    guid = Guid.NewGuid();
                }

                // Try to store, and return new guid on success
                client.Store(delivery);
                return(guid);
            }
        }
        public static DeliveryOutput[] GetOutputsByTargetPeriod(int channelID, int accountID, DateTime start, DateTime end)
        {
            List <DeliveryOutput> outputs    = new List <DeliveryOutput>();
            List <string>         outputsIds = new List <string>();

            using (var client = DeliveryDBClient.Connect())
            {
                using (SqlCommand cmd = DataManager.CreateCommand("Output_GetByTargetPeriod(@channelID:Int,@accountID:Int,@targetPeriodStart:DateTime2,@targetPeriodEnd:DateTime2)", System.Data.CommandType.StoredProcedure))
                {
                    cmd.Connection = client;
                    cmd.Parameters["@channelID"].Value         = channelID;
                    cmd.Parameters["@accountID"].Value         = accountID;
                    cmd.Parameters["@targetPeriodStart"].Value = start;
                    cmd.Parameters["@targetPeriodEnd"].Value   = end;

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            //deliveriesId.Add(Get(Guid.Parse(reader.GetString(0))));
                            outputsIds.Add(reader.GetString(0));
                        }
                    }
                }
                foreach (string id in outputsIds)
                {
                    outputs.Add(GetOutput(Guid.Parse(id)));
                }
                return(outputs.ToArray());
            }
        }
        internal static Delivery[] GetByTargetPeriod(int channelID, int accountID, DateTime start, DateTime end, bool exact)
        {
            List <Delivery> deliveries   = new List <Delivery>();
            List <string>   deliveriesId = new List <string>();

            using (var client = DeliveryDBClient.Connect())
            {
                using (SqlCommand cmd = DataManager.CreateCommand("Delivery_GetByTargetPeriod(@channelID:Int,@accountID:Int,@targetPeriodStart:DateTime2,@targetPeriodEnd:DateTime2,@exact:bit)", System.Data.CommandType.StoredProcedure))
                {
                    cmd.Connection = client;
                    cmd.Parameters["@channelID"].Value         = channelID;
                    cmd.Parameters["@accountID"].Value         = accountID;
                    cmd.Parameters["@targetPeriodStart"].Value = start;
                    cmd.Parameters["@targetPeriodEnd"].Value   = end;
                    cmd.Parameters["@exact"].Value             = exact;

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            //deliveriesId.Add(Get(Guid.Parse(reader.GetString(0))));
                            deliveriesId.Add(reader.GetString(0));
                        }
                    }
                }
                foreach (string id in deliveriesId)
                {
                    deliveries.Add(Get(Guid.Parse(id)));
                }
                return(deliveries.ToArray());
            }
        }
 internal static void Delete(Delivery delivery)
 {
     using (SqlConnection connection = DeliveryDBClient.Connect())
     {
         using (SqlCommand cmd = new SqlCommand(AppSettings.Get(typeof(DeliveryDB), Const.SP_DeliveryDelete)))
         {
             cmd.Connection  = connection;
             cmd.CommandType = System.Data.CommandType.StoredProcedure;
             cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
             cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
             cmd.ExecuteNonQuery();
         }
     }
 }
示例#5
0
        internal static Delivery Get(Guid deliveryID, bool activate = true, IObjectContainer client = null)
        {
            Delivery delivery;
            bool     innerClient             = client == null;
            int      previousActivationDepth = -1;

            if (innerClient)
            {
                client = DeliveryDBClient.Connect();
            }
            else
            {
                previousActivationDepth = client.Ext().Configure().ActivationDepth();
            }

            try
            {
                // set activation depth to 0 so that only an object reference is retrieved, this can then be used to swap the object
                if (!activate)
                {
                    client.Ext().Configure().ActivationDepth(0);
                }

                var results = (from Delivery d in client where d.Guid == deliveryID select d);
                delivery = results.Count() > 0 ? results.First() : null;
            }
            finally
            {
                if (innerClient)
                {
                    client.Dispose();
                }
                else
                {
                    // reset activation depth
                    client.Ext().Configure().ActivationDepth(previousActivationDepth);
                }
            }


            return(delivery);
        }
        internal static DeliveryOutput[] GetOutputsBySignature(string signature, Guid exclude)
        {
            List <DeliveryOutput> outputs = new List <DeliveryOutput>();

            using (var client = DeliveryDBClient.Connect())
            {
                // Select deliveries that match a signature but none of the guids in 'exclude'
                using (SqlCommand cmd = DataManager.CreateCommand("OutPut_GetBySignature(@signature:NvarChar,@exclude:NvarChar)", System.Data.CommandType.StoredProcedure))
                {
                    cmd.Connection = client;
                    cmd.Parameters["@signature"].Value = signature;
                    cmd.Parameters["@exclude"].Value   = exclude.ToString("N");
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            outputs.Add(GetOutput(Guid.Parse(reader.GetString(0))));
                        }
                    }
                }
            }
            return(outputs.ToArray());
        }
示例#7
0
        internal static Delivery[] GetBySignature(string signature, Guid[] exclude)
        {
            List <Delivery> deliveries = new List <Delivery>();

            using (var client = DeliveryDBClient.Connect())
            {
                // Select deliveries that match a signature but none of the guids in 'exclude'
                using (SqlCommand cmd = DataManager.CreateCommand("Delivery_GetBySignature(@signature:NvarChar,@exclude:NvarChar)", System.Data.CommandType.StoredProcedure))
                {
                    cmd.Connection = client;
                    cmd.Parameters["@signature"].Value = "'" + signature + "'";
                    cmd.Parameters["@exclude"].Value   = GetGuidStringArray(exclude); //TODO: Talk with doron it's not the way to do it
                    using (SqlDataReader reader = cmd.ExecuteReader())                //TODO: Talk with doron it's not the way to do it
                    {
                        while (reader.Read())
                        {
                            deliveries.Add(Get(Guid.Parse(reader.GetString(0))));
                        }
                    }
                }
            }
            return(deliveries.ToArray());
        }
        internal static bool GetRuning(long parentInstanceID)
        {
            bool runing = false;

            using (var client = DeliveryDBClient.Connect())
            {
                // Select deliveries that match a signature but none of the guids in 'exclude'
                using (SqlCommand cmd = DataManager.CreateCommand(@"SELECT InstanceID
																	FROM ServiceInstance 
																	WHERE State!= 6 AND State!= 7 AND InstanceID=@instanceid:Bigint"                                                                    , System.Data.CommandType.Text))
                {
                    cmd.Connection = client;
                    cmd.Parameters["@instanceid"].Value = parentInstanceID;
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            runing = true;
                        }
                    }
                }
            }
            return(runing);
        }
        public static DeliveryOutput GetOutput(Guid guid)
        {
            DeliveryOutput output = null;

            using (var client = DeliveryDBClient.Connect())
            {
                // Select deliveries that match a signature but none of the guids in 'exclude'
                using (SqlCommand cmd = DataManager.CreateCommand("OutPut_Get(@outputID:Char)", System.Data.CommandType.StoredProcedure))
                {
                    cmd.Connection = client;
                    cmd.Parameters["@outputID"].Value = guid.ToString("N");

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            #region DeliveryOutput
                            output = new DeliveryOutput()
                            {
                                DeliveryID = reader.Convert <string, Guid>("DeliveryID", s => Guid.Parse(s)),
                                OutputID   = reader.Convert <string, Guid>("OutputID", s => Guid.Parse(s)),
                                Account    = reader.Convert <int?, Account>("AccountID", id => id.HasValue ? new Account()
                                {
                                    ID = id.Value
                                } : null),
                                Channel = reader.Convert <int?, Channel>("ChannelID", id => id.HasValue ? new Channel()
                                {
                                    ID = id.Value
                                } : null),
                                Signature          = reader.Get <string>("Signature"),
                                Status             = reader.Get <DeliveryOutputStatus>("Status"),
                                TimePeriodStart    = reader.Get <DateTime>("TimePeriodStart"),
                                TimePeriodEnd      = reader.Get <DateTime>("TimePeriodEnd"),
                                PipelineInstanceID = reader.Get <long?>("PipelineInstanceID")
                            };

                            output.Account.OriginalID = reader.Get <string>("AccountOriginalID");
                            #endregion

                            #region DeliveryOutputParameters
                            // ..................

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    output.Parameters.Add(reader.Get <string>("Key"), DeserializeJson(reader.Get <string>("Value")));
                                }
                            }

                            // ..................
                            #endregion

                            #region checksum
                            // ..................

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    if (output.Checksum == null)
                                    {
                                        output.Checksum = new Dictionary <string, double>();
                                    }
                                    output.Checksum.Add(reader["MeasureName"].ToString(), Convert.ToDouble(reader["Total"]));
                                }
                            }
                            // ..................
                            #endregion
                        }
                    }
                }



//
            }
            return(output);
        }
        internal static Guid SaveOutput(DeliveryOutput output)
        {
            Guid guid = output.OutputID;

            using (var client = DeliveryDBClient.Connect())
            {
                SqlTransaction transaction = client.BeginTransaction();


                if (guid != Guid.Empty)
                {
                    #region [Delete]
                    // ..................

                    SqlCommand cmd = DataManager.CreateCommand((String.Format("{0}(@outputID:Char)", AppSettings.Get(typeof(DeliveryDB), Const.SP_OutputDelete))), System.Data.CommandType.StoredProcedure);

                    cmd.Connection  = client;
                    cmd.Transaction = transaction;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters["@outputID"].Value = output.OutputID.ToString("N");
                    cmd.ExecuteNonQuery();

                    // ..................
                    #endregion



                    #region DeliveryOutput
                    // ..................


                    if (output.OutputID == Guid.Empty)
                    {
                        output.OutputID = Guid.NewGuid();
                    }
                    if (output.DateCreated == DateTime.MinValue)
                    {
                        output.DateCreated = DateTime.Now;
                    }
                    output.DateModified = DateTime.Now;

                    cmd             = DataManager.CreateCommand(@"
							INSERT INTO [DeliveryOutput] (
								[DeliveryID],
								[OutputID],
								[AccountID],
								[AccountOriginalID],
								[ChannelID],
								[Signature],
								[Status] ,								
								[TimePeriodStart],
								[TimePeriodEnd],
								[DateCreated],
								[DateModified],
								[PipelineInstanceID]
							)
							VALUES (
								@deliveryID:Char,
								@outputID:Char,
								@accountID:Int,
								@accountOriginalID::NVarChar,
								@channelID:Int,
								@signature:NVarChar,
								@status:Int,								
								@timePeriodStart:DateTime2,
								@timePeriodEnd:DateTime2,
								@dateCreated:DateTime,
								@dateModified:DateTime,
								@pipelineInstanceID:BigInt
							)"                            , System.Data.CommandType.Text);
                    cmd.Connection  = client;
                    cmd.Transaction = transaction;

                    cmd.Parameters["@deliveryID"].Value         = output.Delivery.DeliveryID;
                    cmd.Parameters["@outputID"].Value           = output.OutputID.ToString("N");
                    cmd.Parameters["@accountID"].Value          = output.Account != null ? output.Account.ID : -1;
                    cmd.Parameters["@accountOriginalID"].Value  = output.Account.OriginalID != null ? output.Account.OriginalID : (object)DBNull.Value;
                    cmd.Parameters["@channelID"].Value          = output.Channel != null ? output.Channel.ID : -1;
                    cmd.Parameters["@signature"].Value          = output.Signature;
                    cmd.Parameters["@status"].Value             = output.Status;
                    cmd.Parameters["@timePeriodStart"].Value    = output.TimePeriodStart;
                    cmd.Parameters["@timePeriodEnd"].Value      = output.TimePeriodEnd;
                    cmd.Parameters["@dateCreated"].Value        = output.DateCreated;
                    cmd.Parameters["@dateModified"].Value       = output.DateModified;
                    cmd.Parameters["@pipelineInstanceID"].Value = output.PipelineInstanceID.HasValue ? output.PipelineInstanceID.Value : (object)DBNull.Value;

                    cmd.ExecuteNonQuery();


                    // ..................
                    #endregion

                    #region DeliveryOutputParameters
                    // ..................


                    foreach (KeyValuePair <string, object> param in output.Parameters)
                    {
                        cmd             = DataManager.CreateCommand(@"
								INSERT INTO [DeliveryOutputParameters] (
									[DeliveryID],
									[OutputID],
									[Key],
									[Value]
								)
								VALUES (
									@deliveryID:Char,
									@outputID:NVarChar,
									@key:NVarChar,
									@value:NVarChar
								)"                                , System.Data.CommandType.Text);
                        cmd.Connection  = client;
                        cmd.Transaction = transaction;

                        cmd.Parameters["@deliveryID"].Value = output.Delivery.DeliveryID.ToString("N");
                        cmd.Parameters["@outputID"].Value   = output.OutputID.ToString("N");
                        cmd.Parameters["@key"].Value        = param.Key;
                        cmd.Parameters["@value"].Value      = Serialize(param.Value);
                        cmd.ExecuteNonQuery();
                    }


                    // ..................
                    #endregion

                    #region checkSum

                    foreach (KeyValuePair <string, double> sum in output.Checksum)
                    {
                        cmd             = DataManager.CreateCommand(@"
							INSERT INTO [DeliveryOutputChecksum] (
								[DeliveryID],
								[OutputID],
								[MeasureName],
								[Total]
							)
							VALUES (
								@deliveryID:Char,
								@outputid:Char,
								@measureName:NVarChar,
								@total:decimal
								
							)"                            , System.Data.CommandType.Text);
                        cmd.Connection  = client;
                        cmd.Transaction = transaction;

                        cmd.Parameters["@deliveryID"].Value  = output.Delivery.DeliveryID.ToString("N");
                        cmd.Parameters["@outputid"].Value    = output.OutputID.ToString("N");
                        cmd.Parameters["@measureName"].Value = sum.Key;
                        cmd.Parameters["@total"].Value       = sum.Value;


                        cmd.ExecuteNonQuery();
                    }


                    #endregion



                    transaction.Commit();
                }
                else
                {
                    throw new NotSupportedException("In Pipeline 2.9, you cannot save a Delivery without first giving it a GUID.");
                }
            }

            return(guid);
        }
        internal static Delivery GetDelivery(Guid deliveryID, bool deep = true, SqlConnection connection = null)
        {
            Delivery delivery        = null;
            bool     innerConnection = connection == null;

            if (innerConnection)
            {
                connection = DeliveryDBClient.Connect();
            }

            try
            {
                SqlCommand cmd = DataManager.CreateCommand(String.Format("{0}(@deliveryID:Char, @deep:bit)", AppSettings.Get(typeof(DeliveryDB), Const.SP_DeliveryGet)), System.Data.CommandType.StoredProcedure);
                cmd.Connection = connection;
                cmd.Parameters["@deliveryID"].Value = deliveryID.ToString("N");
                cmd.Parameters["@deep"].Value       = deep;

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        #region Delivery
                        // ..................

                        delivery = new Delivery(reader.Convert <string, Guid>("DeliveryID", s => Guid.Parse(s)))
                        {
                            FullyLoaded = deep,
                            Account     = reader.Convert <int?, Account>("Account_ID", id => id.HasValue ? new Account()
                            {
                                ID         = id.Value,
                                OriginalID = reader.Get <string>("Account_OriginalID"),
                            } : null),
                            Channel = reader.Convert <int?, Channel>("ChannelID", id => id.HasValue ? new Channel()
                            {
                                ID = id.Value
                            } : null),
                            DateCreated   = reader.Get <DateTime>("DateCreated"),
                            DateModified  = reader.Get <DateTime>("DateModified"),
                            Description   = reader.Get <string>("Description"),
                            FileDirectory = reader.Get <string>("FileDirectory"),
                        };

                        delivery.InternalSetTimePeriod(
                            DateTimeRange.Parse(reader.Get <string>("TimePeriodDefinition")),
                            reader.Get <DateTime>("TimePeriodStart"),
                            reader.Get <DateTime>("TimePeriodEnd")
                            );

                        // ..................
                        #endregion

                        if (deep)
                        {
                            #region DeliveryParameters
                            // ..................

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    delivery.Parameters.Add(reader.Get <string>("Key"), DeserializeJson(reader.Get <string>("Value")));
                                }
                            }
                            // ..................
                            #endregion

                            #region DeliveryFile
                            // ..................

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    DeliveryFile deliveryFile = new DeliveryFile();
                                    deliveryFile.FileID          = reader.Convert <string, Guid>("DeliveryID", s => Guid.Parse(s));
                                    deliveryFile.FileCompression = reader.Get <FileCompression>("FileCompression");
                                    deliveryFile.SourceUrl       = reader.Get <string>("SourceUrl");
                                    deliveryFile.Name            = reader.Get <string>("Name");
                                    deliveryFile.Location        = reader.Get <string>("Location");
                                    deliveryFile.Status          = reader.Get <DeliveryFileStatus>("Status");
                                    deliveryFile.FileSignature   = reader.Get <string>("FileSignature");
                                    delivery.Files.Add(deliveryFile);
                                }
                            }
                            // ..................
                            #endregion

                            #region DeliveryFileParameters
                            // ..................

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    DeliveryFile deliveryFile = delivery.Files[reader.Get <string>("Name")];
                                    deliveryFile.Parameters.Add(reader.Get <string>("Key"), DeserializeJson(reader.Get <string>("Value")));
                                }
                            }

                            // ..................
                            #endregion

                            #region DeliveryOutput

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    var deliveryOutput = new DeliveryOutput()
                                    {
                                        OutputID = reader.Convert <string, Guid>("OutputID", s => Guid.Parse(s)),
                                        Account  = reader.Convert <int?, Account>("AccountID", id => id.HasValue ? new Account()
                                        {
                                            ID         = id.Value,
                                            OriginalID = reader.Get <string>("AccountOriginalID")
                                        } : null),
                                        Channel = reader.Convert <int?, Channel>("ChannelID", id => id.HasValue ? new Channel()
                                        {
                                            ID = id.Value
                                        } : null),
                                        Signature          = reader.Get <string>("Signature"),
                                        Status             = reader.Get <DeliveryOutputStatus>("Status"),
                                        TimePeriodStart    = reader.Get <DateTime>("TimePeriodStart"),
                                        TimePeriodEnd      = reader.Get <DateTime>("TimePeriodEnd"),
                                        PipelineInstanceID = reader.Get <long>("PipelineInstanceID")
                                    };
                                    delivery.Outputs.Add(deliveryOutput);
                                }
                            }

                            #endregion

                            #region DeliveryOutputParameters
                            // ..................

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    DeliveryOutput deliveryOutput = delivery.Outputs[reader.Get <string>("OutputID")];
                                    deliveryOutput.Parameters.Add(reader.Get <string>("Key"), DeserializeJson(reader.Get <string>("Value")));
                                }
                            }

                            // ..................
                            #endregion

                            #region checksum
                            // ..................

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    var deliveryOutput = delivery.Outputs[reader.Get <string>("OutputID")];
                                    if (deliveryOutput.Checksum == null)
                                    {
                                        deliveryOutput.Checksum = new Dictionary <string, double>();
                                    }
                                    deliveryOutput.Checksum.Add(reader["MeasureName"].ToString(), Convert.ToDouble(reader["Total"]));
                                }
                            }
                            // ..................
                            #endregion
                        }
                    }
                }
            }
            finally
            {
                if (innerConnection)
                {
                    connection.Dispose();
                }
            }

            return(delivery);
        }
        internal static Guid SaveDelivery(Delivery delivery)
        {
            if (!delivery.FullyLoaded)
            {
                throw new InvalidOperationException("Cannot save a delivery that was loaded with deep = false.");
            }

            using (var client = DeliveryDBClient.Connect())
            {
                SqlTransaction transaction = client.BeginTransaction();
                Guid           guid        = delivery.DeliveryID;

                if (guid != Guid.Empty)
                {
                    #region [Delete]
                    // ..................

                    SqlCommand cmd = DataManager.CreateCommand((String.Format("{0}(@deliveryID:Char)", AppSettings.Get(typeof(DeliveryDB), Const.SP_DeliveryDelete))), System.Data.CommandType.StoredProcedure);

                    cmd.Connection  = client;
                    cmd.Transaction = transaction;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                    cmd.ExecuteNonQuery();

                    // ..................
                    #endregion

                    #region Delivery
                    // ..................
                    if (delivery.DateCreated == DateTime.MinValue)
                    {
                        delivery.DateCreated = DateTime.Now;
                    }
                    delivery.DateModified = DateTime.Now;

                    cmd = DataManager.CreateCommand(@"
						INSERT INTO [Delivery] (
								[DeliveryID],
								[Account_ID],
								[Account_OriginalID],
								[ChannelID],
								[DateCreated],
								[DateModified],
								[Description],
								[FileDirectory],
								[TimePeriodDefinition],
								[TimePeriodStart],
								[TimePeriodEnd]
						)
						VALUES (
								@deliveryID:Char,
								@account_ID:Int,
								@account_OriginalID:NVarChar,
								@channelID:Int,
								@dateCreated:DateTime,
								@dateModified:DateTime,
								@description:NVarChar,
								@fileDirectory:NVarChar,
								@timePeriodDefinition:NVarChar,
								@timePeriodStart:DateTime2,
								@timePeriodEnd:DateTime2
						)
						"                        , System.Data.CommandType.Text);

                    cmd.Connection  = client;
                    cmd.Transaction = transaction;

                    cmd.Parameters["@deliveryID"].Value           = delivery.DeliveryID.ToString("N");
                    cmd.Parameters["@account_ID"].Value           = delivery.Account != null ? delivery.Account.ID : -1;
                    cmd.Parameters["@account_originalID"].Value   = delivery.Account == null ? (object)DBNull.Value : delivery.Account.OriginalID == null ? (object)DBNull.Value : delivery.Account.OriginalID;
                    cmd.Parameters["@channelID"].Value            = delivery.Channel != null ? delivery.Channel.ID : -1;;
                    cmd.Parameters["@dateCreated"].Value          = delivery.DateCreated;
                    cmd.Parameters["@dateModified"].Value         = delivery.DateModified;
                    cmd.Parameters["@description"].Value          = delivery.Description == null ? (object)DBNull.Value : delivery.Description;
                    cmd.Parameters["@fileDirectory"].Value        = delivery.FileDirectory;
                    cmd.Parameters["@timePeriodDefinition"].Value = delivery.TimePeriodDefinition.ToString();
                    cmd.Parameters["@timePeriodStart"].Value      = delivery.TimePeriodStart;
                    cmd.Parameters["@timePeriodEnd"].Value        = delivery.TimePeriodEnd;
                    cmd.ExecuteNonQuery();

                    // ..................
                    #endregion

                    #region DeliveryParameters
                    // ..................

                    foreach (KeyValuePair <string, object> param in delivery.Parameters)
                    {
                        cmd             = DataManager.CreateCommand(@"
							INSERT INTO [DeliveryParameters](
								[DeliveryID],
								[Key],
								[Value]
							)
							VALUES (
								@deliveryID:Char,
								@key:NVarChar,
								@value:NVarChar
							)
							"                            , System.Data.CommandType.Text);
                        cmd.Connection  = client;
                        cmd.Transaction = transaction;
                        cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                        cmd.Parameters["@key"].Value        = param.Key;
                        cmd.Parameters["@value"].Value      = Serialize(param.Value);
                        cmd.ExecuteNonQuery();
                    }

                    // ..................
                    #endregion

                    #region DeliveryFile
                    // ..................

                    foreach (DeliveryFile file in delivery.Files)
                    {
                        if (file.FileID == Guid.Empty)
                        {
                            file.FileID = Guid.NewGuid();
                        }
                        if (file.DateCreated == DateTime.MinValue)
                        {
                            file.DateCreated = DateTime.Now;
                        }
                        file.DateModified = DateTime.Now;

                        cmd             = DataManager.CreateCommand(@"
							INSERT INTO [DeliveryFile] (
								[DeliveryID],
								[FileID],
								[Name],
								[DateCreated],
								[DateModified],
								[FileCompression],
								[SourceUrl],
								[Location],
								[Status],
								[FileSignature]
							)
							VALUES (
								@deliveryID:Char,
								@fileID:Char,
								@name:NVarChar,
								@dateCreated:DateTime,
								@dateModified:DateTime,
								@fileCompression:Int,
								@sourceUrl:NVarChar,
								@location:NVarChar,
								@status:Int,
								@fileSignature:NVarChar
							)"                            , System.Data.CommandType.Text);
                        cmd.Connection  = client;
                        cmd.Transaction = transaction;

                        cmd.Parameters["@deliveryID"].Value      = file.Delivery.DeliveryID.ToString("N");
                        cmd.Parameters["@fileID"].Value          = file.FileID.ToString("N");
                        cmd.Parameters["@name"].Value            = file.Name;
                        cmd.Parameters["@dateCreated"].Value     = file.DateCreated;
                        cmd.Parameters["@dateModified"].Value    = file.DateModified;
                        cmd.Parameters["@fileCompression"].Value = file.FileCompression;
                        cmd.Parameters["@sourceUrl"].Value       = file.SourceUrl == null ? (object)DBNull.Value : file.SourceUrl;
                        cmd.Parameters["@location"].Value        = file.Location == null ? (object)DBNull.Value : file.Location;
                        cmd.Parameters["@status"].Value          = file.Status;
                        cmd.Parameters["@fileSignature"].Value   = file.FileSignature == null ? (object)DBNull.Value : file.FileSignature;

                        cmd.ExecuteNonQuery();
                    }

                    // ..................
                    #endregion

                    #region DeliveryFileParameters
                    // ..................

                    foreach (DeliveryFile file in delivery.Files)
                    {
                        foreach (KeyValuePair <string, object> param in file.Parameters)
                        {
                            cmd             = DataManager.CreateCommand(@"
								INSERT INTO [DeliveryFileParameters] (
									[DeliveryID],
									[Name],
									[Key],
									[Value]
								)
								VALUES (
									@deliveryID:Char,
									@name:NVarChar,
									@key:NVarChar,
									@value:NVarChar
								)"                                , System.Data.CommandType.Text);
                            cmd.Connection  = client;
                            cmd.Transaction = transaction;

                            cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                            cmd.Parameters["@name"].Value       = file.Name;
                            cmd.Parameters["@key"].Value        = param.Key;
                            cmd.Parameters["@value"].Value      = Serialize(param.Value);
                            cmd.ExecuteNonQuery();
                        }
                    }

                    // ..................
                    #endregion

                    #region DeliveryOutput
                    // ..................

                    foreach (DeliveryOutput output in delivery.Outputs)
                    {
                        if (output.OutputID == Guid.Empty)
                        {
                            output.OutputID = Guid.NewGuid();
                        }
                        if (output.DateCreated == DateTime.MinValue)
                        {
                            output.DateCreated = DateTime.Now;
                        }
                        output.DateModified = DateTime.Now;

                        cmd             = DataManager.CreateCommand(@"
							INSERT INTO [DeliveryOutput] (
								[DeliveryID],
								[OutputID],
								[AccountID],
								[AccountOriginalID],
								[ChannelID],
								[Signature],
								[Status] ,								
								[TimePeriodStart],
								[TimePeriodEnd],
								[DateCreated],
								[DateModified],
								[PipelineInstanceID]
							)
							VALUES (
								@deliveryID:Char,
								@outputID:Char,
								@accountID:Int,
								@accountOriginalID:NVarChar,
								@channelID:Int,
								@signature:NVarChar,
								@status:Int,								
								@timePeriodStart:DateTime2,
								@timePeriodEnd:DateTime2,
								@dateCreated:DateTime,
								@dateModified:DateTime,
								@pipelineInstanceID:BigInt
							)"                            , System.Data.CommandType.Text);
                        cmd.Connection  = client;
                        cmd.Transaction = transaction;

                        cmd.Parameters["@deliveryID"].Value         = output.Delivery.DeliveryID.ToString("N");
                        cmd.Parameters["@outputID"].Value           = output.OutputID.ToString("N");
                        cmd.Parameters["@accountID"].Value          = output.Account != null ? output.Account.ID : -1;
                        cmd.Parameters["@accountOriginalID"].Value  = output.Account.OriginalID != null ? output.Account.OriginalID : (object)DBNull.Value;
                        cmd.Parameters["@channelID"].Value          = output.Channel != null ? output.Channel.ID : -1;
                        cmd.Parameters["@signature"].Value          = output.Signature;
                        cmd.Parameters["@status"].Value             = output.Status;
                        cmd.Parameters["@timePeriodStart"].Value    = output.TimePeriodStart;
                        cmd.Parameters["@timePeriodEnd"].Value      = output.TimePeriodEnd;
                        cmd.Parameters["@dateCreated"].Value        = output.DateCreated;
                        cmd.Parameters["@dateModified"].Value       = output.DateModified;
                        cmd.Parameters["@pipelineInstanceID"].Value = output.PipelineInstanceID.HasValue ? output.PipelineInstanceID.Value : (object)DBNull.Value;

                        cmd.ExecuteNonQuery();
                    }

                    // ..................
                    #endregion

                    #region DeliveryOutputParameters
                    // ..................

                    foreach (DeliveryOutput output in delivery.Outputs)
                    {
                        foreach (KeyValuePair <string, object> param in output.Parameters)
                        {
                            cmd             = DataManager.CreateCommand(@"
								INSERT INTO [DeliveryOutputParameters] (
									[DeliveryID],
									[OutputID],
									[Key],
									[Value]
								)
								VALUES (
									@deliveryID:Char,
									@outputID:NVarChar,
									@key:NVarChar,
									@value:NVarChar
								)"                                , System.Data.CommandType.Text);
                            cmd.Connection  = client;
                            cmd.Transaction = transaction;

                            cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                            cmd.Parameters["@outputID"].Value   = output.OutputID.ToString("N");
                            cmd.Parameters["@key"].Value        = param.Key;
                            cmd.Parameters["@value"].Value      = Serialize(param.Value);
                            cmd.ExecuteNonQuery();
                        }
                    }

                    // ..................
                    #endregion

                    #region checkSum
                    foreach (var output in delivery.Outputs)
                    {
                        foreach (KeyValuePair <string, double> sum in output.Checksum)
                        {
                            cmd             = DataManager.CreateCommand(@"
							INSERT INTO [DeliveryOutputChecksum] (
								[DeliveryID],
								[OutputID],
								[MeasureName],
								[Total]
							)
							VALUES (
								@deliveryID:Char,
								@outputid:Char,
								@measureName:NVarChar,
								@total:decimal
								
							)"                            , System.Data.CommandType.Text);
                            cmd.Connection  = client;
                            cmd.Transaction = transaction;

                            cmd.Parameters["@deliveryID"].Value  = delivery.DeliveryID.ToString("N");
                            cmd.Parameters["@outputid"].Value    = output.OutputID.ToString("N");
                            cmd.Parameters["@measureName"].Value = sum.Key;
                            cmd.Parameters["@total"].Value       = sum.Value;


                            cmd.ExecuteNonQuery();
                        }
                    }
                    #endregion



                    transaction.Commit();
                }
                else
                {
                    throw new NotSupportedException("In Pipeline 2.9, you cannot save a Delivery without first giving it a GUID.");
                }

                return(guid);
            }
        }
        internal static Delivery Get(Guid deliveryID, bool deep = true, SqlConnection connection = null)
        {
            Delivery delivery        = null;
            bool     innerConnection = connection == null;

            if (innerConnection)
            {
                connection = DeliveryDBClient.Connect();
            }

            try
            {
                SqlCommand cmd = DataManager.CreateCommand("Delivery_Get(@deliveryID:Char, @deep:bit)", System.Data.CommandType.StoredProcedure);
                cmd.Connection = connection;
                cmd.Parameters["@deliveryID"].Value = deliveryID.ToString("N");
                cmd.Parameters["@deep"].Value       = deep;

                using (SqlDataReader reader = cmd.ExecuteReader())
                {
                    while (reader.Read())
                    {
                        #region Delivery

                        delivery = new Delivery(reader.Convert <string, Guid>("DeliveryID", s => Guid.Parse(s)))
                        {
                            FullyLoaded = deep
                        };

                        delivery.Account = reader.Convert <int?, Account>("AccountID", id => id.HasValue ? new Account()
                        {
                            ID = id.Value
                        } : null);
                        delivery.Channel = reader.Convert <int?, Channel>("ChannelID", id => id.HasValue ? new Channel()
                        {
                            ID = id.Value
                        } : null);
                        delivery.Account.OriginalID      = reader.Get <string>("OriginalID");
                        delivery.DateCreated             = reader.Get <DateTime>("DateCreated");
                        delivery.DateModified            = reader.Get <DateTime>("DateModified");
                        delivery.Signature               = reader.Get <string>("Signature");
                        delivery.Description             = reader.Get <string>("Description");
                        delivery.TargetLocationDirectory = reader.Get <string>("TargetLocationDirectory");
                        delivery.InternalSetTargetPeriod(
                            DateTimeRange.Parse(reader.Get <string>("TargetPeriodDefinition")),
                            reader.Get <DateTime>("TargetPeriodStart"),
                            reader.Get <DateTime>("TargetPeriodEnd")
                            );
                        delivery.IsCommited = Convert.ToBoolean(reader["Committed"]);

                        #endregion
                        if (deep)
                        {
                            #region DeliveryParameters

                            if (deep)
                            {
                                if (reader.NextResult())
                                {
                                    while (reader.Read())
                                    {
                                        delivery.Parameters.Add(reader.Get <string>("Key"), DeserializeJson(reader.Get <string>("Value")));
                                    }
                                }
                            }
                            #endregion
                            #region DeliveryHistory

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    delivery.History.Add(new DeliveryHistoryEntry((DeliveryOperation)reader["Operation"], reader.Get <long>("ServiceInstanceID"), new Dictionary <string, object>()));
                                }
                            }
                            #endregion
                            #region DeliveryHistoryParameters
                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    delivery.History[reader.Get <int>("Index")].Parameters.Add(reader.Get <string>("Key"), DeserializeJson(reader.Get <string>("Value")));
                                }
                            }
                            #endregion
                            #region DeliveryFile

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    DeliveryFile deliveryFile = new DeliveryFile();
                                    deliveryFile.Account = reader.Convert <int?, Account>("AccountID", id => id.HasValue ? new Account()
                                    {
                                        ID = id.Value
                                    } : null);
                                    deliveryFile.FileID     = reader.Convert <string, Guid>("DeliveryID", s => Guid.Parse(s));
                                    deliveryFile.FileFormat = (FileCompression)reader["FileCompression"];
                                    deliveryFile.SourceUrl  = reader.Get <string>("SourceUrl");
                                    deliveryFile.Name       = reader.Get <string>("Name");
                                    deliveryFile.Location   = reader.Get <string>("Location");
                                    delivery.Files.Add(deliveryFile);
                                }
                            }
                            #endregion
                            #region DeliveryFileParameters

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    DeliveryFile deliveryFile = delivery.Files[reader.Get <string>("Name")];
                                    deliveryFile.Parameters.Add(reader.Get <string>("Key"), DeserializeJson(reader.Get <string>("Value")));
                                }
                            }
                            #endregion
                            #region DeliveryFileHistory

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    DeliveryFile deliveryFile = delivery.Files[reader["Name"].ToString()];
                                    deliveryFile.History.Add(new DeliveryHistoryEntry((DeliveryOperation)reader["Operation"], Convert.ToInt64(reader["ServiceInstanceID"])));
                                }
                            }
                            #endregion
                            #region DeliveryFileHistoryParameters

                            if (reader.NextResult())
                            {
                                while (reader.Read())
                                {
                                    DeliveryFile deliveryFile = delivery.Files[reader["Name"].ToString()];

                                    deliveryFile.History[reader.Get <int>("Index")].Parameters.Add(reader["Key"].ToString(), reader.Get <object>("Value"));
                                }
                            }
                            #endregion
                        }
                    }
                }
            }
            finally
            {
                if (innerConnection)
                {
                    connection.Dispose();
                }
            }

            /*
             #if DEBUG
             *          Log.Write(String.Format("Delivery - {3}found: {0} (activate: {2}, {1} results)\n", deliveryID, resultCount, activate, delivery == null ? "not " : "" ), LogMessageType.Information);
             *
             #endif
             */
            return(delivery);
        }
        internal static Guid Save(Delivery delivery)
        {
            if (!delivery.FullyLoaded)
            {
                throw new InvalidOperationException("Cannot save a delivery that was loaded with deep = false.");
            }

            using (var client = DeliveryDBClient.Connect())
            {
                SqlTransaction transaction = client.BeginTransaction();
                Guid           guid        = delivery.DeliveryID;

                if (guid != Guid.Empty)
                {
                    #region Delete all Delivery
                    SqlCommand cmd = new SqlCommand("Delivery_Delete");

                    cmd.Connection  = client;
                    cmd.Transaction = transaction;
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                    cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                    cmd.ExecuteNonQuery();
                    #endregion

                    #region Delivery
                    cmd = new SqlCommand(@"INSERT INTO [Delivery]
	       ([DeliveryID]
	       ,[AccountID]
	       ,[ChannelID]
		   ,[OriginalID]
	       ,[DateCreated]
	       ,[DateModified]
	       ,[Signature]
	       ,[Description]
	       ,[TargetLocationDirectory]
	       ,[TargetPeriodDefinition]
	       ,[TargetPeriodStart]
	       ,[TargetPeriodEnd]
		   ,[Committed])
	 VALUES
	       (@deliveryID,
	        @accountID,
	        @channelID,
		    @originalID,
	        @dateCreated,
	        @dateModified,
	        @signature,
	        @description,
	        @targetLocationDirectory,
	        @targetPeriodDefinition,
	        @targetPeriodStart,
	        @targetPeriodEnd,
			@committed)"            , client, transaction);

                    cmd.Connection = client;
                    cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                    cmd.Parameters.Add("@accountID", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@channelID", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@originalID", System.Data.SqlDbType.NVarChar);
                    cmd.Parameters.Add("@dateCreated", System.Data.SqlDbType.DateTime);
                    cmd.Parameters.Add("@dateModified", System.Data.SqlDbType.DateTime);
                    cmd.Parameters.Add("@signature", System.Data.SqlDbType.NVarChar);
                    cmd.Parameters.Add("@description", System.Data.SqlDbType.NVarChar);
                    cmd.Parameters.Add("@targetLocationDirectory", System.Data.SqlDbType.NVarChar);
                    cmd.Parameters.Add("@targetPeriodDefinition", System.Data.SqlDbType.NVarChar);
                    cmd.Parameters.Add("@targetPeriodStart", System.Data.SqlDbType.DateTime2); //must be date time since sql round or somthing, leave it!!
                    cmd.Parameters.Add("@targetPeriodEnd", System.Data.SqlDbType.DateTime2);   //must be date time since sql round or somthing, leave it!!
                    cmd.Parameters.Add("@committed", System.Data.SqlDbType.Bit);

                    cmd.Parameters["@deliveryID"].Value              = delivery.DeliveryID.ToString("N");
                    cmd.Parameters["@accountID"].Value               = delivery.Account.ID;
                    cmd.Parameters["@channelID"].Value               = delivery.Channel.ID;;
                    cmd.Parameters["@originalID"].Value              = delivery.Account.OriginalID == null ? (object)DBNull.Value : delivery.Account.OriginalID;
                    cmd.Parameters["@dateCreated"].Value             = delivery.DateCreated;
                    cmd.Parameters["@dateModified"].Value            = delivery.DateModified;
                    cmd.Parameters["@signature"].Value               = delivery.Signature;
                    cmd.Parameters["@description"].Value             = delivery.Description == null ? (object)DBNull.Value : delivery.Description;
                    cmd.Parameters["@targetLocationDirectory"].Value = delivery.TargetLocationDirectory;
                    cmd.Parameters["@targetPeriodDefinition"].Value  = delivery.TargetPeriod.ToString();
                    cmd.Parameters["@targetPeriodStart"].Value       = delivery.TargetPeriodStart;
                    cmd.Parameters["@targetPeriodEnd"].Value         = delivery.TargetPeriodEnd;
                    cmd.Parameters["@committed"].Value               = delivery.IsCommited;
                    cmd.ExecuteNonQuery();
                    #endregion

                    #region DeliveryParameters

                    foreach (KeyValuePair <string, object> param in delivery.Parameters)
                    {
                        cmd             = new SqlCommand(@"INSERT INTO [DeliveryParameters]
										([DeliveryID]
										,[Key]
										,[Value])
										 VALUES
									    (@deliveryID
									    ,@key
										,@value)"                                        );
                        cmd.Connection  = client;
                        cmd.Transaction = transaction;
                        cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                        cmd.Parameters.Add("@key", System.Data.SqlDbType.NVarChar);
                        cmd.Parameters.Add("@value", System.Data.SqlDbType.NVarChar);
                        cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                        cmd.Parameters["@key"].Value        = param.Key;

                        cmd.Parameters["@value"].Value = Serialize(param.Value);
                        cmd.ExecuteNonQuery();
                    }
                    #endregion

                    #region DeliveryHistory

                    int index = 0;
                    foreach (DeliveryHistoryEntry historyEntry in delivery.History)
                    {
                        cmd             = new SqlCommand(@"INSERT INTO [DeliveryHistory]
											   ([DeliveryID]
											   ,[ServiceInstanceID]
											   ,[Index]
											   ,[Operation]
											   ,[DateRecorded])
												 VALUES
											   (@deliveryID
											   ,@serviceInstanceID
											   ,@index
											   ,@operation
											   ,@dateRecorded)"                                            );
                        cmd.Connection  = client;
                        cmd.Transaction = transaction;
                        cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                        cmd.Parameters.Add("@serviceInstanceID", System.Data.SqlDbType.BigInt);
                        cmd.Parameters.Add("@index", System.Data.SqlDbType.Int);
                        cmd.Parameters.Add("@operation", System.Data.SqlDbType.Int);
                        cmd.Parameters.Add("@dateRecorded", System.Data.SqlDbType.DateTime);


                        cmd.Parameters["@deliveryID"].Value        = delivery.DeliveryID.ToString("N");
                        cmd.Parameters["@index"].Value             = index;
                        cmd.Parameters["@operation"].Value         = historyEntry.Operation;
                        cmd.Parameters["@dateRecorded"].Value      = historyEntry.DateRecorded;
                        cmd.Parameters["@serviceInstanceID"].Value = historyEntry.ServiceInstanceID;
                        cmd.ExecuteNonQuery();

                        index++;
                    }
                    #endregion

                    #region DeliveryHistoryParameters
                    index = 0;
                    if (delivery.History != null)
                    {
                        foreach (DeliveryHistoryEntry historyEntry in delivery.History)
                        {
                            if (historyEntry.Parameters != null)
                            {
                                foreach (KeyValuePair <string, object> param in historyEntry.Parameters)
                                {
                                    cmd             = new SqlCommand(@"INSERT INTO [DeliveryHistoryParameters]
											   ([DeliveryID]
											   ,[Index]
											   ,[Key]
											   ,[Value])
											  VALUES
											   (@deliveryID
											   ,@index
											   ,@key
											   ,@value)"                                            );
                                    cmd.Connection  = client;
                                    cmd.Transaction = transaction;
                                    cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                                    cmd.Parameters.Add("@index", System.Data.SqlDbType.Int);
                                    cmd.Parameters.Add("@key", System.Data.SqlDbType.NVarChar);
                                    cmd.Parameters.Add("@value", System.Data.SqlDbType.NVarChar);


                                    cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                                    cmd.Parameters["@index"].Value      = index;
                                    cmd.Parameters["@key"].Value        = param.Key;
                                    cmd.Parameters["@value"].Value      = Serialize(param.Value);


                                    cmd.ExecuteNonQuery();
                                }
                            }
                            index++;
                        }
                    }
                    #endregion

                    #region DeliveryFile
                    foreach (DeliveryFile file in delivery.Files)
                    {
                        if (file.FileID == Guid.Empty)
                        {
                            file.FileID = Guid.NewGuid();
                        }
                        cmd             = new SqlCommand(@"INSERT INTO [DeliveryFile]
											   ([DeliveryID]
											   ,[FileID]
											   ,[Name]
											   ,[AccountID]
											   ,[ChannelID]
											   ,[DateCreated]
											   ,[DateModified]
											   ,[FileCompression]
											   ,[SourceUrl]
											   ,[Location])
										 VALUES
											   (@deliveryID
											   ,@fileID
											   ,@name
											   ,@accountID
											   ,@channelID
											   ,@dateCreated
											   ,@dateModified
											   ,@fileCompression
											   ,@sourceUrl
											   ,@location)"                                            );
                        cmd.Connection  = client;
                        cmd.Transaction = transaction;
                        cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                        cmd.Parameters.Add("@fileID", System.Data.SqlDbType.Char);
                        cmd.Parameters.Add("@name", System.Data.SqlDbType.NVarChar);
                        cmd.Parameters.Add("@accountID", System.Data.SqlDbType.Int);
                        cmd.Parameters.Add("@channelID", System.Data.SqlDbType.Int);
                        cmd.Parameters.Add("@dateCreated", System.Data.SqlDbType.DateTime);
                        cmd.Parameters.Add("@dateModified", System.Data.SqlDbType.DateTime);
                        cmd.Parameters.Add("@fileCompression", System.Data.SqlDbType.Int);
                        cmd.Parameters.Add("@sourceUrl", System.Data.SqlDbType.NVarChar);
                        cmd.Parameters.Add("@location", System.Data.SqlDbType.NVarChar);


                        cmd.Parameters["@deliveryID"].Value      = file.Delivery.DeliveryID.ToString("N");
                        cmd.Parameters["@fileID"].Value          = file.FileID.ToString("N");
                        cmd.Parameters["@name"].Value            = file.Name;
                        cmd.Parameters["@accountID"].Value       = delivery.Account.ID;
                        cmd.Parameters["@channelID"].Value       = delivery.Channel.ID;
                        cmd.Parameters["@dateCreated"].Value     = file.DateCreated;
                        cmd.Parameters["@dateModified"].Value    = file.DateModified;
                        cmd.Parameters["@fileCompression"].Value = file.FileFormat;
                        cmd.Parameters["@sourceUrl"].Value       = file.SourceUrl == null ? (object)DBNull.Value : file.SourceUrl;
                        cmd.Parameters["@location"].Value        = file.Location == null ? (object)DBNull.Value : file.Location;

                        cmd.ExecuteNonQuery();
                    }

                    #endregion

                    #region DeliveryFileParameters
                    foreach (DeliveryFile file in delivery.Files)
                    {
                        foreach (KeyValuePair <string, object> param in file.Parameters)
                        {
                            cmd             = new SqlCommand(@"INSERT INTO [DeliveryFileParameters]
												   ([DeliveryID]
												   ,[Name]
												   ,[Key]
												   ,[Value])
											 VALUES
												   (@deliveryID
												   ,@name
												   ,@key
												   ,@value)"                                                );
                            cmd.Connection  = client;
                            cmd.Transaction = transaction;
                            cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                            cmd.Parameters.Add("@name", System.Data.SqlDbType.NVarChar);
                            cmd.Parameters.Add("@key", System.Data.SqlDbType.NVarChar);
                            cmd.Parameters.Add("@value", System.Data.SqlDbType.NVarChar);

                            cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                            cmd.Parameters["@name"].Value       = file.Name;
                            cmd.Parameters["@key"].Value        = param.Key;

                            cmd.Parameters["@value"].Value = Serialize(param.Value);
                            cmd.ExecuteNonQuery();
                        }
                    }


                    #endregion

                    #region DeliveryFileHistory

                    foreach (DeliveryFile file in delivery.Files)
                    {
                        index = 0;
                        if (file.History != null)
                        {
                            foreach (DeliveryHistoryEntry historyEntry in file.History)
                            {
                                cmd             = new SqlCommand(@"INSERT INTO [DeliveryFileHistory]
											   ([DeliveryID]
											   ,[Name]
											   ,[ServiceInstanceID]
											   ,[Index]
											   ,[Operation]
											   ,[DateRecorded])
										 VALUES
											   (@deliveryID
											   ,@name
											   ,@serviceInstanceID
											   ,@index
											   ,@operation
											   ,@dateRecorded)"                                            );
                                cmd.Connection  = client;
                                cmd.Transaction = transaction;
                                cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                                cmd.Parameters.Add("@name", System.Data.SqlDbType.NVarChar);
                                cmd.Parameters.Add("@serviceInstanceID", System.Data.SqlDbType.BigInt);
                                cmd.Parameters.Add("@index", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@operation", System.Data.SqlDbType.Int);
                                cmd.Parameters.Add("@dateRecorded", System.Data.SqlDbType.DateTime);


                                cmd.Parameters["@deliveryID"].Value        = delivery.DeliveryID.ToString("N");
                                cmd.Parameters["@name"].Value              = file.Name;
                                cmd.Parameters["@serviceInstanceID"].Value = historyEntry.ServiceInstanceID;
                                cmd.Parameters["@index"].Value             = index;
                                cmd.Parameters["@operation"].Value         = historyEntry.Operation;
                                cmd.Parameters["@dateRecorded"].Value      = historyEntry.DateRecorded;

                                cmd.ExecuteNonQuery();



                                index++;
                            }
                        }
                    }

                    #endregion

                    #region DeliveryFileHistoryParameters
                    foreach (DeliveryFile file in delivery.Files)
                    {
                        index = 0;
                        if (file.History != null)
                        {
                            foreach (DeliveryHistoryEntry historyEntry in file.History)
                            {
                                if (historyEntry.Parameters != null)
                                {
                                    foreach (KeyValuePair <string, object> param in historyEntry.Parameters)
                                    {
                                        cmd             = new SqlCommand(@"INSERT INTO [DeliveryFileHistoryParameters]
													   ([DeliveryID]
													   ,[Name]
													   ,[Index]
													   ,[Key]
													   ,[Value])
												 VALUES
													   (@deliveryID
													   ,@name
													   ,@index
													   ,@key
													   ,@value)"                                                    );
                                        cmd.Connection  = client;
                                        cmd.Transaction = transaction;
                                        cmd.Parameters.Add("@deliveryID", System.Data.SqlDbType.Char);
                                        cmd.Parameters.Add("@name", System.Data.SqlDbType.NVarChar);
                                        cmd.Parameters.Add("@index", System.Data.SqlDbType.Int);
                                        cmd.Parameters.Add("@key", System.Data.SqlDbType.NVarChar);
                                        cmd.Parameters.Add("@value", System.Data.SqlDbType.NVarChar);

                                        cmd.Parameters["@deliveryID"].Value = delivery.DeliveryID.ToString("N");
                                        cmd.Parameters["@name"].Value       = file.Name;
                                        cmd.Parameters["@index"].Value      = index;
                                        cmd.Parameters["@key"].Value        = param.Key;

                                        cmd.Parameters["@value"].Value = Serialize(param.Value);
                                        cmd.ExecuteNonQuery();
                                    }
                                }
                                index++;
                            }
                        }
                    }

                    #endregion



                    transaction.Commit();
                }
                else
                {
                    guid = Guid.NewGuid();
                    throw new NotSupportedException("In Pipeline 2.9, you cannot save a Delivery without first giving it a GUID.");
                }



                return(guid);
            }
        }