/// <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); }
/// <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); } } }
//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); }