/// <summary>
        /// load edge types by account
        /// </summary>
        public static Dictionary <string, EdgeType> LoadEdgeTypes(int accountId, SqlConnection connection)
        {
            var edgeTypes = new Dictionary <string, EdgeType>();

            try
            {
                using (var cmd = SqlUtility.CreateCommand("MD_EdgeType_Get", CommandType.StoredProcedure))
                {
                    cmd.Parameters.AddWithValue("@accountID", accountId);
                    cmd.Connection = connection;

                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var type = new EdgeType
                            {
                                TypeID    = int.Parse(reader["TypeID"].ToString()),
                                Name      = reader["Name"].ToString(),
                                TableName = reader["TableName"].ToString(),
                                ClrType   = Type.GetType(reader["ClrType"].ToString())
                            };
                            edgeTypes.Add(type.Name, type);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get edge types from DB", ex);
            }
            return(edgeTypes);
        }
Exemple #2
0
        private Dictionary <string, Channel> GetChannelsFromDB()
        {
            Dictionary <string, Channel> channels = new Dictionary <string, Channel>(StringComparer.CurrentCultureIgnoreCase);
            SqlConnection connection;

            connection = new SqlConnection(AppSettings.GetConnectionString(typeof(AdMetricsImportManager), "StagingDatabase"));
            try
            {
                using (connection)
                {
                    SqlCommand cmd = SqlUtility.CreateCommand(@"GetChannels()", System.Data.CommandType.StoredProcedure);
                    cmd.Connection = connection;
                    connection.Open();
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Channel channel = new Channel()
                            {
                                ID   = Convert.ToInt16(reader[0]),
                                Name = Convert.ToString(reader[1])
                            };
                            channels.Add(channel.Name, channel);
                        }
                    }
                }
                //var a=channels.Where(pp=>pp.Key.ToLower()=="fff".tol
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get Channels from DB", ex);
            }
            return(channels);
        }
        /// <summary>
        /// Load specific account or all accounts if account id = -1
        /// </summary>
        public static Dictionary <string, Account> LoadAccounts(int accountId, SqlConnection connection)
        {
            var accounts = new Dictionary <string, Account>();

            try
            {
                using (var cmd = SqlUtility.CreateCommand("Account_Get", CommandType.StoredProcedure))
                {
                    cmd.Parameters.AddWithValue("@accountID", accountId);
                    cmd.Connection = connection;

                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var account = new Account
                            {
                                ID   = int.Parse(reader["ID"].ToString()),
                                Name = reader["Name"].ToString()
                            };
                            accounts.Add(account.Name, account);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get accounts from DB", ex);
            }
            return(accounts);
        }
        /// <summary>
        /// Load channels by account (all if account id = -1)
        /// </summary>
        /// <returns></returns>
        public static Dictionary <string, Channel> LoadChannels(SqlConnection connection)
        {
            var channels = new Dictionary <string, Channel>(StringComparer.CurrentCultureIgnoreCase);

            try
            {
                using (var cmd = SqlUtility.CreateCommand("Channel_Get", CommandType.StoredProcedure))
                {
                    cmd.Connection = connection;
                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var channel = new Channel
                            {
                                ID   = int.Parse(reader["ID"].ToString()),
                                Name = reader["Name"].ToString()
                            };
                            channels.Add(channel.Name, channel);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get Channels from DB", ex);
            }
            return(channels);
        }
Exemple #5
0
        /// <summary>
        /// Search for best match table in staging DB according to delivery table structure
        /// </summary>
        /// <returns></returns>
        public string FindStagingTable()
        {
            // nothing to do if there is no metrics table (import objects only)
            if (String.IsNullOrEmpty(TableName))
            {
                return(null);
            }

            using (var cmd = SqlUtility.CreateCommand(SP_FIND_BEST_MATCH_METRICS_TABLE, CommandType.StoredProcedure))
            {
                cmd.Connection = _deliverySqlConnection;
                var tableNameParam = new SqlParameter {
                    ParameterName = "@BestMatch", Size = 1000, Direction = ParameterDirection.Output
                };
                cmd.Parameters.Add(tableNameParam);
                cmd.Parameters.AddWithValue("@InputTable", TableName);
                cmd.ExecuteNonQuery();

                if (tableNameParam.Value == null || String.IsNullOrEmpty(tableNameParam.Value.ToString()))
                {
                    throw new Exception(String.Format("No staging table was found for delivery table {0}", TableName));
                }

                return(tableNameParam.Value.ToString());
            }
        }
Exemple #6
0
        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 = SqlUtility.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());
            }
        }
        /// <summary>
        /// Load measures by account
        /// </summary>
        public static Dictionary <string, Measure> LoadMeasures(int accountId, SqlConnection connection)
        {
            var measures = new Dictionary <string, Measure>();

            try
            {
                using (var cmd = SqlUtility.CreateCommand("MD_Measure_Get", CommandType.StoredProcedure))
                {
                    cmd.Parameters.AddWithValue("@accountID", accountId);
                    cmd.Connection = connection;

                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            var measure = new Measure
                            {
                                ID       = int.Parse(reader["ID"].ToString()),
                                Name     = reader["Name"].ToString(),
                                DataType = reader["DataType"] != DBNull.Value ? (MeasureDataType)int.Parse(reader["DataType"].ToString()) : MeasureDataType.Number,
                                //InheritedByDefault = reader["InheritedByDefault"] != DBNull.Value && bool.Parse(reader["InheritedByDefault"].ToString()),
                                Options = reader["Options"] != DBNull.Value ? (MeasureOptions)int.Parse(reader["Options"].ToString()) : MeasureOptions.None,
                            };
                            measures.Add(measure.Name, measure);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get measures from DB", ex);
            }
            return(measures);
        }
        private bool CheckFileConflict(Dictionary <string, string> fileInfo)
        {
            string fileSignature = string.Format("{0}-{1}-{2}", fileInfo["Name"], fileInfo["ModifyDate"], fileInfo["Size"]);

            SqlConnection connection;



            try
            {
                connection = new SqlConnection(AppSettings.GetConnectionString(typeof(FtpImporterPreInitializerService), "DeliveryDB"));
                using (connection)
                {
                    SqlCommand   cmd     = SqlUtility.CreateCommand(@"DeliveryFile_GetBySignature()", System.Data.CommandType.StoredProcedure);
                    SqlParameter fileSig = new SqlParameter("signature", fileSignature);
                    cmd.Parameters.Add(fileSig);
                    cmd.Connection = connection;
                    connection.Open();
                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        if (reader.Read())
                        {
                            Core.Utilities.Log.Write(string.Format("File with same signature already exists in DB,File Signature: {0}", fileSignature), LogMessageType.Warning);
                            return(true);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get files signature from DB", ex);
            }

            return(false);
        }
Exemple #9
0
        private static string GetAuthFromDB(string mccEmail, out string mccPassword)
        {
            var auth = "";

            mccPassword = "";
            var connection = new SqlConnection(AppSettings.GetConnectionString(typeof(AdwordsUtill), "MCC_Auth"));

            try
            {
                using (connection)
                {
                    var cmd = SqlUtility.CreateCommand(@"GetGoogleMccAuth(@MccEmail:Nvarchar)", System.Data.CommandType.StoredProcedure);
                    cmd.Connection = connection;
                    connection.Open();
                    cmd.Parameters["@MccEmail"].Value = mccEmail;

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            mccPassword = Encryptor.Dec(reader[0].ToString());
                            auth        = reader[1].ToString();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get auth key from DB", ex);
            }
            return(auth);
        }
Exemple #10
0
        // ==============================================
        #endregion

        private Dictionary <string, Account> GetAccountsFromDB(int currentAccountId)
        {
            Dictionary <string, Account> accounts = new Dictionary <string, Account>();
            SqlConnection connection;

            connection = new SqlConnection(AppSettings.GetConnectionString(typeof(AdMetricsImportManager), "StagingDatabase"));
            try
            {
                using (connection)
                {
                    SqlCommand cmd = SqlUtility.CreateCommand(@"GetAccountFamily_ById(@CurrentAccountId:int)", System.Data.CommandType.StoredProcedure);
                    cmd.Connection = connection;
                    connection.Open();
                    cmd.Parameters["@CurrentAccountId"].Value = currentAccountId;

                    using (SqlDataReader reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            Account account = new Account()
                            {
                                ID   = Convert.ToInt32(reader[1]),
                                Name = Convert.ToString(reader[0])
                            };
                            accounts.Add(account.Name, account);
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get accounts from DB", ex);
            }
            return(accounts);
        }
Exemple #11
0
        /// <summary>
        /// Call DB stored procedure to create all delivery object tables by table prefix
        /// currently all delivery objects tables are created for all accounts even if they are not in use
        /// </summary>
        /// <param name="tablePrefix"></param>
        public void CreateDeliveryObjectTables(string tablePrefix)
        {
            using (var cmd = SqlUtility.CreateCommand("MD_ObjectTables_Create", CommandType.StoredProcedure))
            {
                cmd.Parameters.AddWithValue("@TablePrefix", string.Format("{0}_", tablePrefix));
                cmd.Connection = _objectsSqlConnection;

                cmd.CommandTimeout = 80;                 //DEFAULT IS 30 AND SOMTIME NOT ENOUGH WHEN RUNING CUBE
                cmd.ExecuteNonQuery();
            }
        }
        /// <summary>
        /// Set relationships between edge fields and edge types (many-2-many) according to account id
        /// </summary>
        public static void SetEdgeTypeEdgeFieldRelation(int accountid, Dictionary <string, EdgeType> edgeTypes, List <EdgeField> edgeFields, SqlConnection connection)
        {
            try
            {
                using (var cmd = SqlUtility.CreateCommand("MD_EdgeTypeField_Get", CommandType.StoredProcedure))
                {
                    cmd.Parameters.AddWithValue("@accountID", accountid);
                    cmd.Connection = connection;

                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            // find parent edge type nad edge field
                            var parentTypeId = int.Parse(reader["ParentTypeID"].ToString());
                            var fieldtId     = int.Parse(reader["FieldID"].ToString());

                            var parentType = edgeTypes.Values.FirstOrDefault(x => x.TypeID == parentTypeId);
                            if (parentType == null)
                            {
                                throw new ConfigurationErrorsException(String.Format("Configuration error: Unknown parent edge type {0} while loading edge type fields", parentTypeId));
                            }

                            var field = edgeFields.FirstOrDefault(x => x.FieldID == fieldtId);
                            if (field == null)
                            {
                                throw new ConfigurationErrorsException(String.Format("Configuration error: Unknown edge field {0} while loading edge type fields", fieldtId));
                            }

                            var typeField = new EdgeTypeField
                            {
                                ColumnName = reader["ColumnName"].ToString(),
                                IsIdentity = bool.Parse(reader["IsIdentity"].ToString()),
                                Field      = field
                            };

                            // add edge field to parent edge type
                            if (!parentType.Fields.Contains(typeField))
                            {
                                parentType.Fields.Add(typeField);
                            }
                            else
                            {
                                throw new ConfigurationErrorsException(String.Format("Configuration error: Field {0} already exists in parent edge type {1}", field.Name, parentType.Name));
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get extra fields from DB", ex);
            }
        }
        public void CreateCommand_Simple_Success()
        {
            IDbCommand cmd = SqlUtility.CreateCommand(new Mocks.MockDBConnection(new Mocks.ExecuteReaderNoAction()), "TestSproc", new Dictionary <string, object>()
            {
                { "Arg1", 25 },
                { "Arg2", "string" },
                { "Arg3", false }
            });

            Assert.That(cmd.CommandText == "TestSproc");
            Assert.That(cmd.CommandType == CommandType.StoredProcedure);
            Assert.That(cmd.Parameters.Count == 3);
        }
Exemple #14
0
        protected void CleanDelivery()
        {
            // delete previous delivery tables
            using (var deliveryConnection = new SqlConnection(AppSettings.GetConnectionString(typeof(MetricsDeliveryManager), Consts.ConnectionStrings.Deliveries)))
            {
                var cmd = SqlUtility.CreateCommand("Drop_Delivery_tables", CommandType.StoredProcedure);
                cmd.Parameters.AddWithValue("@TableInitial", String.Format("{0}_", ACCOUNT_ID));
                cmd.Connection = deliveryConnection;
                deliveryConnection.Open();
                cmd.ExecuteNonQuery();

                cmd = new SqlCommand("DELETE [dbo].[MD_MetricsMetadata]", deliveryConnection);
                cmd.ExecuteNonQuery();
            }
        }
        protected override void OnStage(Delivery delivery, int pass)
        {
            CurrentDelivery = delivery;

            if (pass == STAGING_PASS_OBJECTS)
            {
                // IDENTITYMANAGER: insert new EdgeObjects and update existing from Delivery to EdgeObject DB by IdentityStatus
                Identify(2, delivery);
            }
            else if (pass == STAGING_PASS_METRICS)
            {
                // TABLEMANAGER: insert delivery metrics into staging
                if (CurrentDelivery.Parameters[Consts.DeliveryHistoryParameters.StagingMetricsTableName] != null &&
                    CurrentDelivery.Parameters[Consts.DeliveryHistoryParameters.DeliveryMetricsTableName] != null)
                {
                    var deliveryTable = CurrentDelivery.Parameters[Consts.DeliveryHistoryParameters.DeliveryMetricsTableName].ToString();
                    var stagingTable  = CurrentDelivery.Parameters[Consts.DeliveryHistoryParameters.StagingMetricsTableName].ToString();
                    if (!stagingTable.ToLower().StartsWith("[dbo]"))
                    {
                        stagingTable = String.Format("[dbo].[{0}]", stagingTable);
                    }

                    // for Debug only - execute Edge Viewer in .NET
                    if (Options.IdentityInDebug)
                    {
                        EdgeViewer.StageMetrics(delivery.Account.ID, deliveryTable, stagingTable, _deliverySqlConnection);
                    }
                    // to be executed in real scenario - execute SQL CLR (DB stored procedure that executes .NET code of Edge Viewer)
                    else
                    {
                        using (var cmd = SqlUtility.CreateCommand("EdgeObjects.dbo.MetricsStaging", CommandType.StoredProcedure))
                        {
                            cmd.Connection     = _objectsSqlConnection;
                            cmd.CommandTimeout = 300;
                            var stageSqlParam = new SqlParameter {
                                ParameterName = "@stagingSql", Size = 4000, Direction = ParameterDirection.Output
                            };
                            cmd.Parameters.Add(stageSqlParam);
                            cmd.Parameters.AddWithValue("@accoutId", delivery.Account.ID);
                            cmd.Parameters.AddWithValue("@deliveryTable", deliveryTable);
                            cmd.Parameters.AddWithValue("@stagingTable", stagingTable);

                            cmd.ExecuteNonQuery();
                        }
                    }
                }
            }
        }
        /// <summary>
        /// Load edge fields by account + set edge type for each field
        /// </summary>
        public static List <EdgeField> LoadEdgeFields(int accountId, Dictionary <string, EdgeType> edgeTypes, SqlConnection connection)
        {
            var edgeFields = new List <EdgeField>();

            try
            {
                using (var cmd = SqlUtility.CreateCommand("MD_EdgeField_Get", CommandType.StoredProcedure))
                {
                    cmd.Parameters.AddWithValue("@accountID", accountId);
                    cmd.Connection = connection;

                    using (var reader = cmd.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            EdgeField field = null;
                            Type      type  = Type.GetType(reader["FieldType"].ToString());
                            if (type == null)
                            {
                                field = new SystemField();
                            }
                            else
                            {
                                field = Activator.CreateInstance(type) as EdgeField;
                            }

                            if (field != null)
                            {
                                field.FieldID       = int.Parse(reader["FieldID"].ToString());
                                field.Name          = reader["Name"].ToString();
                                field.DisplayName   = reader["DisplayName"].ToString();
                                field.FieldEdgeType = edgeTypes.Values.FirstOrDefault(x => x.TypeID == int.Parse(reader["FieldTypeID"].ToString()));

                                edgeFields.Add(field);
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to get extra fields from DB", ex);
            }
            return(edgeFields);
        }
        protected override void OnRollbackDelivery(Delivery delivery, int pass)
        {
            string guid = delivery.DeliveryID.ToString("N");

            _rollbackCommand             = _rollbackCommand ?? SqlUtility.CreateCommand(Options.SqlRollbackCommand, CommandType.StoredProcedure);
            _rollbackCommand.Connection  = _deliverySqlConnection;
            _rollbackCommand.Transaction = _rollbackTransaction;

            _rollbackCommand.Parameters["@DeliveryID"].Value   = guid;
            _rollbackCommand.Parameters["@StagingTable"].Value = CurrentDelivery.Parameters[Consts.DeliveryHistoryParameters.StagingMetricsTableName];

            _rollbackCommand.ExecuteNonQuery();

            // This is redundant (SP already does this) but to sync our objects in memory we do it here also
            foreach (DeliveryOutput output in delivery.Outputs)
            {
                output.Status = DeliveryOutputStatus.RolledBack;
            }
        }
Exemple #18
0
		public string FindStagingTable(string metricsTableName)
		{
			string stagingTableName;
			using (SqlCommand command = SqlUtility.CreateCommand(AppSettings.Get(this, "SP_FindStagingTable"), CommandType.StoredProcedure))
			{
				command.Parameters["@templateTable"].Value = metricsTableName;
				command.Parameters["@templateDB"].Value = "";//TODO: FROM WHERE DO i TAKE THIS TABLE?
				command.Parameters["@searchDB"].Value = "";//TODO: FROM WHERE DO i TAKE THIS TABLE?
				using (SqlDataReader reader = command.ExecuteReader())
				{
					if (!reader.Read())
						throw new Exception("No staging table   Found");
					else
						stagingTableName = reader["TABLE_NAME"].ToString();

				}


			}
			return stagingTableName;
		}
Exemple #19
0
        private static void SaveAuthTokenToDB(string mccEmail, string authToken)
        {
            var connection = new SqlConnection(AppSettings.GetConnectionString(typeof(AdwordsUtill), "MCC_Auth"));

            try
            {
                using (connection)
                {
                    var cmd = SqlUtility.CreateCommand(@"SetGoogleMccAuth(@MccEmail:Nvarchar,@AuthToken:Nvarchar)", System.Data.CommandType.StoredProcedure);
                    cmd.Connection = connection;
                    connection.Open();
                    cmd.Parameters["@MccEmail"].Value  = mccEmail;
                    cmd.Parameters["@AuthToken"].Value = authToken;
                    cmd.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Error while trying to set a new Auth key", ex);
            }
        }
        /*=========================*/

        /// <summary>
        /// Help function to execute Identity stages:
        /// stage 1 - identify delivery object by existing Edge Objects
        /// stage 2 - insert new and update odified Edge Objects by delivery objects
        /// DEBUG (Options): execute Identity Manager .NET code
        /// REAL: execute SQl CLR wich executes Identity Manager .NET code in DB
        /// </summary>
        protected void Identify(int identityStage, Delivery delivery)
        {
            // for Debug only - execute Identity Manager in .NET
            if (Options.IdentityInDebug)
            {
                var identityManager = new IdentityManager(_objectsSqlConnection)
                {
                    TablePrefix        = delivery.Parameters[Consts.DeliveryHistoryParameters.TablePerfix].ToString(),
                    TransformTimestamp = DateTime.Parse(delivery.Parameters[Consts.DeliveryHistoryParameters.TransformTimestamp].ToString()),
                    AccountId          = delivery.Account.ID,
                    ConfigXml          = Options.IdentityConfig
                };

                if (identityStage == 1)
                {
                    identityManager.IdentifyDeliveryObjects();
                }
                else if (identityStage == 2)
                {
                    identityManager.UpdateEdgeObjects();
                }
            }
            // to be executed in real scenario - execute SQL CLR (DB stored procedure that executes .NET code of Identity Manager)
            else
            {
                var spName = identityStage == 1 ? "EdgeObjects.dbo.IdentityI" : "EdgeObjects.dbo.IdentityII";
                using (var cmd = SqlUtility.CreateCommand(spName, CommandType.StoredProcedure))
                {
                    cmd.Connection     = _objectsSqlConnection;
                    cmd.CommandTimeout = 300;
                    cmd.Parameters.AddWithValue("@accoutId", delivery.Account.ID);
                    cmd.Parameters.AddWithValue("@deliveryTablePrefix", delivery.Parameters[Consts.DeliveryHistoryParameters.TablePerfix].ToString());
                    cmd.Parameters.AddWithValue("@identity1Timestamp", DateTime.Parse(delivery.Parameters[Consts.DeliveryHistoryParameters.TransformTimestamp].ToString()));
                    cmd.Parameters.AddWithValue("@identityConfig", Options.IdentityConfig);

                    cmd.ExecuteNonQuery();
                }
            }
        }
Exemple #21
0
        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 = SqlUtility.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());
        }
        protected override void OnRollbackOutput(DeliveryOutput output, int pass)
        {
            string guid = output.OutputID.ToString("N");

            if (output.Status == DeliveryOutputStatus.Staged)
            {
                _rollbackCommand             = _rollbackCommand ?? SqlUtility.CreateCommand(Options.SqlRollbackCommand, CommandType.StoredProcedure);
                _rollbackCommand.Connection  = _deliverySqlConnection;
                _rollbackCommand.Transaction = _rollbackTransaction;

                _rollbackCommand.Parameters["@DeliveryOutputID"].Value = guid;
                _rollbackCommand.Parameters["@StagingTable"].Value     = output.Parameters[Consts.DeliveryHistoryParameters.StagingMetricsTableName];

                _rollbackCommand.ExecuteNonQuery();
            }
            else if (output.Status == DeliveryOutputStatus.Committed)
            {
                output.Status = DeliveryOutputStatus.RollbackPending;
            }
            else
            {
                throw new InvalidOperationException("Delivery output cannot be rolled back because it is neither staged nor committed.");
            }
        }
Exemple #23
0
        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 = SqlUtility.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 = SqlUtility.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["@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             = SqlUtility.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             = SqlUtility.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             = SqlUtility.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             = SqlUtility.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 != null ? output.Account.OriginalID != null ? output.Account.OriginalID : (object)DBNull.Value : (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             = SqlUtility.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             = SqlUtility.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);
            }
        }
Exemple #24
0
        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 = SqlUtility.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
                            } : 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
                                        } : 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 <Guid>("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);
        }
Exemple #25
0
        protected override ServiceOutcome DoPipelineWork()
        {
            // takes deliveries or outputs to rollback from Config
            var deliveriesIds = Configuration.Deliveries.Split(',');
            var ouputsIds     = Configuration.Deliveries.Split(',');

            if (deliveriesIds.Length == 0 && ouputsIds.Length == 0)
            {
                throw new Exception("Option RollbackDeliveries or RollbackOutputs must be defined");
            }

            // start Rollback
            using (var conn = new SqlConnection(AppSettings.GetConnectionString(this, Consts.ConnectionStrings.Staging)))
            {
                conn.Open();
                var tran = conn.BeginTransaction();

                // rollback deliveries
                if (deliveriesIds.Length > 0)
                {
                    var cmd = SqlUtility.CreateCommand(Configuration.RollbackDeliveriesStoredProc, System.Data.CommandType.StoredProcedure);
                    cmd.Connection  = conn;
                    cmd.Transaction = tran;

                    foreach (var deliveryID in deliveriesIds)
                    {
                        cmd.Parameters["@DeliveryID"].Value = deliveryID;
                        cmd.Parameters["@TableName"].Value  = Configuration.TableName;
                        cmd.ExecuteNonQuery();
                    }
                }
                // rollback outputs
                if (ouputsIds.Length > 0)
                {
                    var cmd = SqlUtility.CreateCommand(Configuration.RollbackOutputsStoredProc, System.Data.CommandType.StoredProcedure);
                    cmd.Connection  = conn;
                    cmd.Transaction = tran;

                    foreach (var outputID in ouputsIds)
                    {
                        cmd.Parameters["@DeliveryOutputID"].Value = outputID;
                        cmd.Parameters["@TableName"].Value        = Configuration.TableName;
                        cmd.ExecuteNonQuery();
                    }
                }

                // commit transaction
                tran.Commit();
            }

            return(ServiceOutcome.Success);

            //for new db

            /*
             * string checksumThreshold = Configuration.Parameters.Get<T>(Consts.ConfigurationOptions.ChecksumTheshold];
             * MetricsImportManagerOptions options = new MetricsImportManagerOptions()
             * {
             *      SqlTransformCommand = Configuration.Parameters.Get<T>(Consts.AppSettings.SqlTransformCommand],
             *      SqlStageCommand = Configuration.Parameters.Get<T>(Consts.AppSettings.SqlStageCommand],
             *      SqlRollbackCommand = Configuration.Parameters.Get<T>(Consts.AppSettings.SqlRollbackCommand],
             *      ChecksumThreshold = checksumThreshold == null ? 0.01 : double.Parse(checksumThreshold)
             * };
             * string checksumThreshold = Configuration.Parameters.Get<T>(Consts.ConfigurationOptions.ChecksumTheshold];
             * string importManagerTypeName = Configuration.GetOption(Consts.ConfigurationOptions.ImportManagerType);
             * Type importManagerType = Type.GetType(importManagerTypeName);
             * var importManager = (MetricsImportManager)Activator.CreateInstance(importManagerType, this.InstanceID, options);
             *
             *
             * string[] deliveriesIds = null;
             * string[] ouputsIds = null;
             * if (Configuration.Options.ContainsKey(Consts.ConfigurationOptions.RollbackDeliveries))
             *      deliveriesIds = this.Configuration.GetOption(Consts.ConfigurationOptions.RollbackDeliveries).Split(',');
             * else if (Configuration.Options.ContainsKey(Consts.ConfigurationOptions.RollbackOutputs))
             *      ouputsIds = this.Configuration.GetOption(Consts.ConfigurationOptions.RollbackOutputs).Split(',');
             * else
             *      throw new Exception("Option RollbackDeliveries or RollbackOutputs must be defined");
             *
             * string tableName = this.Configuration.GetOption(Consts.ConfigurationOptions.RollbackTableName);
             * List<DeliveryOutput> outputs=new List<DeliveryOutput>();
             * List<Delivery> Deliveries=new List<Delivery>();
             * if (deliveriesIds != null && deliveriesIds.Length > 0)
             * {
             *      foreach (var id in deliveriesIds)
             *      {
             *              Deliveries.Add(Delivery.Get(Guid.Parse(id)));
             *
             *      }
             *      importManager.RollbackDeliveries(Deliveries.ToArray());
             *
             * }
             * if (ouputsIds != null && ouputsIds.Length > 0)
             * {
             *      foreach (var id in ouputsIds)
             *      {
             *      outputs.Add(DeliveryOutput.Get(Guid.Parse(id)));
             *      }
             *      importManager.RollbackOutputs(outputs.ToArray());
             * }
             * return Core.Services.ServiceOutcome.Success; */
        }
Exemple #26
0
        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 = SqlUtility.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             = SqlUtility.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["@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             = SqlUtility.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             = SqlUtility.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);
        }
Exemple #27
0
        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 = SqlUtility.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 <Guid?>("PipelineInstanceID")
                            };

                            #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);
        }
        ProtocolResponse IProcessMessageStrategy.Process(ProtocolRequest request)
        {
            ProtocolResponse response = new ProtocolResponse(request.Action);

            if (request.IsBulkQuery)
            {
                // now deserialize this string into a list of dictionaries for parsing
                List <Dictionary <string, object> > DataDictionary =
                    Newtonsoft.Json.JsonConvert.DeserializeObject <List <Dictionary <string, object> > >(request.Data);

                try
                {
                    if (CheckConnection())
                    {
                        foreach (var d in DataDictionary)
                        {
                            IDbCommand    cmd     = SqlUtility.CreateCommand(Connection, request.Action, d);
                            List <object> results = SqlUtility.InvokeCommand(cmd, out string error);

                            response.Error += error;
                            if (results != null)
                            {
                                response.Data.Add(results);
                            }
                        }
                        response.Result = true;
                    }
                    else
                    {
                        response.Result = false;
                        response.Error  = "Could not connect to MYSQL instance";
                    }
                }
                catch (Exception ex)
                {
                    CatchException(ref ex, ref request, ref response);
                }
                finally
                {
                    CloseConnection();
                }
            }
            else
            {
                // now deserialize this string into a list of dictionaries for parsing
                Dictionary <string, object> DataDictionary = null;

                if (request.Type == JTokenType.Object)
                {
                    DataDictionary = Newtonsoft.Json.JsonConvert.DeserializeObject <Dictionary <string, object> >(request.Data);
                }
                else
                {
                    DataDictionary = new Dictionary <string, object>();
                }

                // special scenario - because we cant get the ip address of the game server from DCS, we'll get it from the socket sender object
                // and specially insert it as a parameter into the data dictionary
                // the other special scenario is the server description request can supply - this can contain harmful html, so we must sanitize the input
                if (request.Action == ACTION_GET_SERVERID)
                {
                    DataDictionary.Add("IP", request.IPAddress);
                    if (DataDictionary.ContainsKey("Description"))
                    {
                        try
                        {
                            string html = Convert.ToString(DataDictionary["Description"]);
                            DataDictionary["Description"] = Utility.SanitizeHTML(html, ref Config);
                        }
                        catch (Exception ex)
                        {
                            Logger.Log("Error sanitizing ServerDescription html string (Action: " + request.Action + ") - " + ex.Message);
                            response.Error  = "Error sanitizing ServerDescription html string (Action: " + request.Action + ") - " + ex.Message;
                            response.Result = false;
                            return(response);
                        }
                    }

                    // Check the API version that the game is using
                    if (DataDictionary.ContainsKey("Version") && DataDictionary["Version"].ToString() != Config.VersionKey)
                    {
                        Logger.Log("Client Version Mismatch (Expected: " + Config.VersionKey + ", Got: " + DataDictionary["Version"] + ")");
                        response.Error  = "Version mismatch - you are running an older version of KI - the latest version is [" + Config.Version + "] - Please update to the latest version";
                        response.Result = false;
                        return(response);
                    }
                    else if (!DataDictionary.ContainsKey("Version"))
                    {
                        Logger.Log("Client Version Mismatch - Client did not provide version information");
                        response.Error  = "Version mismatch - you are running an older version of KI - the latest version is [" + Config.Version + "] - Please update to the latest version";
                        response.Result = false;
                        return(response);
                    }
                }

                try
                {
                    if (CheckConnection())
                    {
                        IDbCommand    cmd     = SqlUtility.CreateCommand(Connection, request.Action, DataDictionary);
                        List <object> results = SqlUtility.InvokeCommand(cmd, out string error);

                        response.Error += error;
                        if (results != null)
                        {
                            response.Data.Add(results);
                        }
                        response.Result = true;
                    }
                    else
                    {
                        response.Result = false;
                        response.Error  = "Could not connect to MYSQL instance";
                    }
                }
                catch (Exception ex)
                {
                    CatchException(ref ex, ref request, ref response);
                }
                finally
                {
                    CloseConnection();
                }
            }
            return(response);
        }