Exemplo n.º 1
0
        /// <summary>
        /// Initiates the synchronization of source and target databases by cycling
        /// through a DataSyncActionsCollection and executing the script member
        /// of each DataSyncAction object.
        /// </summary>
        /// <returns>
        /// True  - synchronized
        /// True  - SyncActionsCollection.Count == 0, because CompareForSync() not called.
        /// False - exceptions encountered
        /// </returns>
        public bool Sync()
        {
            throw new NotImplementedException();
            try
            {
                var ticks = DateTime.Now.Ticks;
                TotalDataEventWaitTime = new TimeSpan(ticks);
                TotalDataEventWaitTime = TotalDataEventWaitTime.Subtract(TotalDataEventWaitTime);
                var start = new TimeSpan(ticks);
                DataTimer.RaiseTimerStatusEvent("Starting synchronization of source and target databases.");

                Exceptions.Clear();

                // For server specific stuff
                SyncInternal();

                var finish   = new TimeSpan(DateTime.Now.Ticks);
                var interval = finish.Subtract(start);
                interval = interval.Subtract(TotalDataEventWaitTime);
                DataTimer.RaiseTimerStatusEvent(interval, "Finished synchronization.");
            }
            catch (Exception exception)
            {
                Exceptions.Add(exception);
            }

            return(Exceptions.Count == 0);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Initiates the synchronization of source and target databases by cycling
        /// through a DataSyncActionsCollection and executing the script member
        /// of each DataSyncAction object.
        /// </summary>
        /// <returns>
        /// True  - synchronized
        /// True  - SyncActionsCollection.Count == 0, because CompareForSync() not called.
        /// False - exceptions encountered
        /// </returns>
        protected override bool SyncInternal()
        {
            Exceptions.Clear();
            if (DataSyncActionsCollection.Count == 0)
            {
                return(true);
            }

            var scripts = Script();

            if (scripts.Count == 0)
            {
                return(true);
            }

            var start = new TimeSpan(DateTime.Now.Ticks);

            DataTimer.RaiseTimerStatusEvent(
                string.Format("Connecting to database with connection name [{0}]",
                              TargetDataConnectionInfo.Name));

            var random            = new Random();
            var transactionNumber = random.Next();
            var transactionName   = string.Format("IdioSyncracy{0}", transactionNumber);

            using (var sqlConnection = new SqlConnection(TargetDataConnectionInfo.ConnectionString))
            {
                sqlConnection.Open();

                var finish   = new TimeSpan(DateTime.Now.Ticks);
                var interval = finish.Subtract(start);
                DataTimer.RaiseTimerStatusEvent(interval, "Database connection established.");

                if (!TargetDataConnectionInfo.IsAcceptableVersion(sqlConnection))
                {
                    TargetDataConnectionInfo.ThrowVersionException();
                }

                var sqlCommand     = sqlConnection.CreateCommand();
                var sqlTransaction = sqlConnection.BeginTransaction(transactionName);
                sqlCommand.Connection  = sqlConnection;
                sqlCommand.Transaction = sqlTransaction;
                sqlCommand.Parameters.Add("@ReturnValue", SqlDbType.Int).Direction = ParameterDirection.ReturnValue;

                try
                {
                    foreach (var script in scripts)
                    {
                        sqlCommand.CommandText = script;
                        var rowsAffected = sqlCommand.ExecuteNonQuery();

                        if (rowsAffected == -1)
                        {
                            continue;
                        }

                        var exception = new Exception("The following query failed to execute: " + sqlCommand.CommandText);
                        Exceptions.Add(exception);
                        sqlTransaction.Rollback(transactionName);

                        return(false);
                    }

                    sqlTransaction.Commit();

                    finish   = new TimeSpan(DateTime.Now.Ticks);
                    interval = finish.Subtract(start);
                    DataTimer.RaiseTimerStatusEvent(interval, "SQL Transaction commited successfully.");

                    sqlConnection.Close();

                    return(true);
                }
                catch (Exception ex1)
                {
                    Exceptions.Add(ex1);

                    try
                    {
                        sqlTransaction.Rollback(transactionName);
                        sqlConnection.Close();
                    }
                    catch (Exception ex2)
                    {
                        // This catch block will handle any errors that may have occurred
                        // on the server that would cause the rollback to fail, such as
                        // a closed connection.

                        Exceptions.Add(ex2);
                    }

                    return(false);
                }
            }
        }
Exemplo n.º 3
0
        //public bool FetchTargetDataModelFromJson(string json)
        //{

        //    var ticks = DateTime.Now.Ticks;
        //    TotalDataEventWaitTime = new TimeSpan(ticks);
        //    TotalDataEventWaitTime = TotalDataEventWaitTime.Subtract(TotalDataEventWaitTime);
        //    var start = new TimeSpan(ticks);
        //    DataTimer.RaiseTimerStatusEvent("Fetching target database JSon metadata.");

        //    Clear();

        //    try
        //    {
        //        if (string.IsNullOrEmpty(json) || string.IsNullOrWhiteSpace(json))
        //        {
        //            Exceptions.Add(new Exception(
        //                "Target metadeta could not be pulled from JSon."));
        //            return false;
        //        }

        //        var server = Server.FromJson(json);
        //        if (server == null)
        //        {
        //            Exceptions.Add(new Exception(
        //                "Target metadeta could not be pulled from JSon."));
        //            return false;
        //        }

        //        TargetServer = server;

        //        if (DataProperties.CatalogsToCompare.Count > 0)
        //            foreach (var catalogValue in
        //                DataProperties.CatalogsToCompare.Values.Where(
        //                    catalogValue => !TargetServer.Catalogs.ContainsKey(catalogValue)
        //                ))
        //                Server.RemoveCatalog(TargetServer, catalogValue);
        //    }
        //    catch (Exception ex)
        //    {
        //        Exceptions.Add(ex);
        //        return false;
        //    }

        //    var finish = new TimeSpan(DateTime.Now.Ticks);
        //    var interval = finish.Subtract(start);
        //    interval = interval.Subtract(TotalDataEventWaitTime);
        //    DataTimer.RaiseTimerStatusEvent(interval, "Finished fetching target database JSon metadata.");
        //    if (TotalDataEventWaitTime.Ticks > 0)
        //        DataTimer.RaiseTimerStatusEvent(TotalDataEventWaitTime, "Total user response time in dialog windows.");

        //    return true;
        //}

        public bool FetchTargetDataModelFromServer(bool closeDataConnectionAfterUse = true)
        {
            if (TargetDataConnectionInfo == null)
            {
                Exceptions.Add(new Exception("Target connection info has not been provided."));
                return(false);
            }

            var ticks = DateTime.Now.Ticks;

            TotalDataEventWaitTime = new TimeSpan(ticks);
            TotalDataEventWaitTime = TotalDataEventWaitTime.Subtract(TotalDataEventWaitTime);
            var start = new TimeSpan(ticks);

            DataTimer.RaiseTimerStatusEvent("Fetching target database metadata.");

            Clear();

            // Open target data connection if it does not already exist and should exist.
            if (TargetDataConnectionManager == null)
            {
                var targetStart = new TimeSpan(DateTime.Now.Ticks);
                DataTimer.RaiseTimerStatusEvent(string.Format("Creating and opening connection for target server: [{0}]", TargetDataConnectionInfo.Name));
                TargetDataConnectionManager = new DataConnectionManager(TargetDataConnectionInfo);
                TargetDataConnectionManager.Open();
                var targetFinish   = new TimeSpan(DateTime.Now.Ticks);
                var targetInterval = targetFinish.Subtract(targetStart);
                DataTimer.RaiseTimerStatusEvent(
                    targetInterval,
                    string.Format("Finished creating and opening connection for target server: [{0}]",
                                  TargetDataConnectionInfo.Name));
            }
            else if (!TargetDataConnectionManager.IsOpen())
            {
                if (TargetDataConnectionManager.IsBusy())
                {
                    Exceptions.Add(new Exception(
                                       string.Format("Target connection for server: [{0}]... is busy! Please try again in a few moments.",
                                                     TargetDataConnectionInfo.Name)
                                       ));
                    return(false);
                }

                var targetStart = new TimeSpan(DateTime.Now.Ticks);
                DataTimer.RaiseTimerStatusEvent(
                    string.Format("Opening connection for target connection: [{0}]",
                                  TargetDataConnectionInfo.Name));
                TargetDataConnectionManager.Open();
                var targetFinish   = new TimeSpan(DateTime.Now.Ticks);
                var targetInterval = targetFinish.Subtract(targetStart);
                DataTimer.RaiseTimerStatusEvent(
                    targetInterval,
                    string.Format("Finished opening connection for target server: [{0}]",
                                  TargetDataConnectionInfo.Name));
            }

            TargetServer     = null;
            DataSyncComparer = null;

            if (!TargetDataConnectionManager.IsOpen())
            {
                Exceptions.Add(new Exception(
                                   string.Format("Connection for target server: [{0}]... could not be opened.",
                                                 TargetDataConnectionInfo.Name)));
                return(false);
            }

            var targetServerStart = new TimeSpan(DateTime.Now.Ticks);

            DataTimer.RaiseTimerStatusEvent(
                string.Format("Creating and pulling data objects for target connection [{0}]",
                              TargetDataConnectionInfo.Name));
            TargetServer = new Server
            {
                ObjectName  = TargetDataConnectionInfo.Name,
                DataContext = TargetDataConnectionInfo.DataContext
            };

            Server.BuildCatalogs(TargetServer, TargetDataConnectionManager, closeDataConnectionAfterUse);

            var targetServerFinish   = new TimeSpan(DateTime.Now.Ticks);
            var targetServerInterval = targetServerFinish.Subtract(targetServerStart);

            DataTimer.RaiseTimerStatusEvent(
                targetServerInterval,
                string.Format(
                    "Finished creating data objects for target connection [{0}]",
                    TargetDataConnectionInfo.Name));

            var finish   = new TimeSpan(DateTime.Now.Ticks);
            var interval = finish.Subtract(start);

            interval = interval.Subtract(TotalDataEventWaitTime);
            DataTimer.RaiseTimerStatusEvent(interval, "Finished fetching target database metadata.");
            if (TotalDataEventWaitTime.Ticks > 0)
            {
                DataTimer.RaiseTimerStatusEvent(TotalDataEventWaitTime, "Total user response time in dialog windows.");
            }

            return(true);
        }