From af8530c50d90c12ebe60383e67101920760c314f Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Wed, 27 Dec 2017 13:16:00 +0200 Subject: Fixed issue with local sync SQL Logic error. Added some missing columns to SQLite db. Direct Remote Sync is fully working !!! --- .../Local/ExtensionMethods.cs | 2 +- .../Tango.Synchronization/Local/LocalDBComparer.cs | 27 ++++++++++++++++++++++ .../Tango.Synchronization/Local/SqliteDataBase.cs | 8 +++---- .../Remote/RemoteDBComparer.cs | 24 ++++++++++++------- 4 files changed, 48 insertions(+), 13 deletions(-) (limited to 'Software/Visual_Studio/Tango.Synchronization') diff --git a/Software/Visual_Studio/Tango.Synchronization/Local/ExtensionMethods.cs b/Software/Visual_Studio/Tango.Synchronization/Local/ExtensionMethods.cs index 8746f9146..89b3969e4 100644 --- a/Software/Visual_Studio/Tango.Synchronization/Local/ExtensionMethods.cs +++ b/Software/Visual_Studio/Tango.Synchronization/Local/ExtensionMethods.cs @@ -57,7 +57,7 @@ namespace Tango.Synchronization.Local } else { - if (def.Contains("randomblob") || def.Contains("localtime")) + if (def.ToLower().Contains("randomblob") || def.ToLower().Contains("datetime ('now')")) { def = def.Insert(0, "("); def = def.Insert(def.Length - 1, ")"); diff --git a/Software/Visual_Studio/Tango.Synchronization/Local/LocalDBComparer.cs b/Software/Visual_Studio/Tango.Synchronization/Local/LocalDBComparer.cs index 7883f9cc8..79d3857ad 100644 --- a/Software/Visual_Studio/Tango.Synchronization/Local/LocalDBComparer.cs +++ b/Software/Visual_Studio/Tango.Synchronization/Local/LocalDBComparer.cs @@ -72,6 +72,33 @@ namespace Tango.Synchronization.Local foreach (var masterTable in overwrite_tables) { LogManager.Log("Generating table overwrite difference for table " + masterTable.TableName); + + var slaveTable = SlaveSQL.Tables.SingleOrDefault(x => x.TableName == masterTable.TableName); //Get matching slave table on slave db. + + if (slaveTable == null) //Table not found on slave. + { + LogManager.Log("Table not found on slave, adding difference."); + //Clone table from slave db to master db including records! + diffs.Add(new Diff(DiffAction.AddTableToSlave, String.Format("Add table {0} to slave", masterTable.TableName), () => SlaveSQL.CloneTableFrom(MasterSQL, masterTable), SlaveSQL.GetCloneTableFromCommand(MasterSQL, masterTable))); + continue; + } + + foreach (DataColumn masterColumn in masterTable.Columns) + { + LogManager.Log("Searching for column " + masterColumn.ColumnName + " on slave..."); + + var slaveColumn = slaveTable.Columns[masterColumn.ColumnName]; //Get matching slave column on slave table. + + if (slaveColumn == null) //Slave column not found. + { + LogManager.Log("Column not found on slave, adding difference."); + //Add column to slave table. + diffs.Add(new Diff(DiffAction.AddColumnToSlave, String.Format("Add column {0} to slave table", masterColumn.ColumnName), () => SlaveSQL.AddColumn(masterTable, masterColumn), SlaveSQL.GetAddColumnCommand(masterTable, masterColumn))); + } + + LogManager.Log("Column found."); + } + diffs.Add(new Diff(DiffAction.ReplaceTableDataInSlave, "Replace all rows on slave table " + masterTable.TableName, () => { diff --git a/Software/Visual_Studio/Tango.Synchronization/Local/SqliteDataBase.cs b/Software/Visual_Studio/Tango.Synchronization/Local/SqliteDataBase.cs index 6068d5b6c..2596853c6 100644 --- a/Software/Visual_Studio/Tango.Synchronization/Local/SqliteDataBase.cs +++ b/Software/Visual_Studio/Tango.Synchronization/Local/SqliteDataBase.cs @@ -247,13 +247,13 @@ namespace Tango.Synchronization.Local public DataColumn AddColumn(DataTable table, DataColumn column) { var insertCommand = _connection.CreateCommand(); - insertCommand.CommandText = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} {3} {4} {5} {6}", + insertCommand.CommandText = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} {3} {4} {5}", table.TableName, column.ColumnName, column.GetSQLType(), table.PrimaryKey.Contains(column) ? "PRIMARY KEY" : null, column.Unique ? "UNIQUE" : null, - column.IsNotNull() ? "NOT NULL" : null, + //column.IsNotNull() ? "NOT NULL" : null, column.HasDefaultValue() ? ("DEFAULT " + column.GetDefaultValue()) : null); @@ -272,13 +272,13 @@ namespace Tango.Synchronization.Local /// public String GetAddColumnCommand(DataTable table, DataColumn column) { - String cmd = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} {3} {4} {5} {6}", + String cmd = String.Format("ALTER TABLE {0} ADD COLUMN {1} {2} {3} {4} {5}", table.TableName, column.ColumnName, column.GetSQLType(), table.PrimaryKey.Contains(column) ? "PRIMARY KEY" : null, column.Unique ? "UNIQUE" : null, - column.IsNotNull() ? "NOT NULL" : null, + //column.IsNotNull() ? "NOT NULL" : null, column.HasDefaultValue() ? ("DEFAULT " + column.GetDefaultValue()) : null); return cmd; diff --git a/Software/Visual_Studio/Tango.Synchronization/Remote/RemoteDBComparer.cs b/Software/Visual_Studio/Tango.Synchronization/Remote/RemoteDBComparer.cs index 514948d57..84103af39 100644 --- a/Software/Visual_Studio/Tango.Synchronization/Remote/RemoteDBComparer.cs +++ b/Software/Visual_Studio/Tango.Synchronization/Remote/RemoteDBComparer.cs @@ -40,7 +40,7 @@ namespace Tango.Synchronization.Remote LogManager.Log("Querying all local configurations..."); var local_configurations = _localDB.CONFIGURATIONS.ToList(); LogManager.Log("Querying all local configuration dispensers..."); - var local_configurations_dispensers = _localDB.IDS_PACKS.ToList(); + var local_ids_packs = _localDB.IDS_PACKS.ToList(); LogManager.Log("Querying all local contacts..."); var local_contacts = _localDB.CONTACTS.ToList(); LogManager.Log("Querying all local dispensers..."); @@ -57,6 +57,8 @@ namespace Tango.Synchronization.Remote var local_users = _localDB.USERS.ToList(); LogManager.Log("Querying all local users roles..."); var local_users_roles = _localDB.USERS_ROLES.ToList(); + LogManager.Log("Querying all CATS..."); + var local_cats = _localDB.CATS.ToList(); LogManager.Log("Loading SQL Server database to memory..."); @@ -102,16 +104,20 @@ namespace Tango.Synchronization.Remote LogManager.Log("Querying all remote configurations dispensers..."); guids = remote_configurations.Select(x => x.GUID).ToList(); - var remote_configurations_dispensers = _remoteDB.IDS_PACKS.Where(x => guids.Contains(x.CONFIGURATION_GUID)).ToList(); + var remote_ids_packs = _remoteDB.IDS_PACKS.Where(x => guids.Contains(x.CONFIGURATION_GUID)).ToList(); LogManager.Log("Querying all remote dispensers..."); - guids = remote_configurations_dispensers.Select(x => x.DISPENSER_GUID).ToList(); + guids = remote_ids_packs.Select(x => x.DISPENSER_GUID).ToList(); var remote_dispensers = _remoteDB.DISPENSERS.Where(x => guids.Contains(x.GUID)).ToList(); LogManager.Log("Querying all remote cartridges..."); - guids = remote_configurations_dispensers.Select(x => x.CARTRIDGE_GUID).ToList(); + guids = remote_ids_packs.Select(x => x.CARTRIDGE_GUID).ToList(); var remote_cartridges = _remoteDB.CARTRIDGES.Where(x => guids.Contains(x.GUID)).ToList(); + LogManager.Log("Querying all remote CATS..."); + guids = remote_machines.Select(x => x.GUID).ToList(); + var remote_cats = _remoteDB.CATS.Where(x => guids.Contains(x.MACHINE_GUID)).ToList(); + foreach (var config in _remoteDB.SYNC_CONFIGURATIONS.Where(x => (SyncConfiguration)x.SYNC_TYPE == SyncConfiguration.OverwriteLocal)) { @@ -129,7 +135,7 @@ namespace Tango.Synchronization.Remote CompareCollections(remote_configurations, local_configurations, _remoteDB.CONFIGURATIONS, _localDB.CONFIGURATIONS); LogManager.Log("Comparing configurations dispensers"); - CompareCollections(remote_configurations_dispensers, local_configurations_dispensers, _remoteDB.IDS_PACKS, _localDB.IDS_PACKS); + CompareCollections(remote_ids_packs, local_ids_packs, _remoteDB.IDS_PACKS, _localDB.IDS_PACKS); LogManager.Log("Comparing contacts"); CompareCollections(remote_contacts, local_contacts, _remoteDB.CONTACTS, _localDB.CONTACTS); @@ -155,6 +161,9 @@ namespace Tango.Synchronization.Remote LogManager.Log("Comparing users roles"); CompareCollections(remote_users_roles, local_users_roles, _remoteDB.USERS_ROLES, _localDB.USERS_ROLES); + LogManager.Log("Comparing cats"); + CompareCollections(remote_cats, local_cats, _remoteDB.CATS, _localDB.CATS); + LogManager.Log("Comparison done!"); return _diffs; @@ -168,12 +177,11 @@ namespace Tango.Synchronization.Remote private void CopyEntity(Object source, Object destination) { - foreach (var prop in source.GetType().GetProperties().Where(x => x.PropertyType.IsPrimitive || x.PropertyType == typeof(String) || x.PropertyType == typeof(DateTime))) + foreach (var prop in source.GetType().GetProperties().Where(x => x.PropertyType.IsPrimitive || x.PropertyType == typeof(String) || x.PropertyType == typeof(DateTime) || x.PropertyType == typeof(byte[]))) { if (destination.GetType().GetProperty(prop.Name) == null) { - LogManager.Log(String.Format("Warning: property {0} not found on destination entity {1}!", prop.Name, destination.GetType().Name)); - continue; + throw LogManager.Log(new InvalidOperationException(String.Format("Property '{0}' not found on destination table '{1}'.", prop.Name, destination.GetType().Name))); } if (prop.PropertyType == typeof(Int64)) -- cgit v1.3.1