Ejemplo n.º 1
0
        private void BuildSchema(params Type[] tables)
        {
            foreach (Type type in tables)
            {
                var typeInfo = type.GetTypeInfo();
#if ENABLE_IL2CPP
                var directionAttribute = typeInfo.GetCustomAttribute <SyncMode> ();
#else
                var directionAttribute =
                    typeInfo.CustomAttributes
                    .Where(x => x.AttributeType == typeof(SyncMode))
                    .Select(x => (SyncMode)x.InflateAttribute())
                    .FirstOrDefault();
#endif
                string tableName = TableMapping.GetTableName(type);
                if (directionAttribute is null)
                {
                    Log.Logger.Warning("SyncDirection is not defined");
                    directionAttribute = new SyncMode(SyncDirection.Download);
                }
                var direction = directionAttribute.Direction;

                this.Tables.TryGetValue(tableName, out SchemaTable mapping);
                if (mapping is null)
                {
                    mapping = new SchemaTable(tableName, direction);
                    this.Tables.Add(tableName, mapping);
                }
                mapping.Add(Daemon.Current.DaemonConfig.Remote.GetMapping(type));
                mapping.Add(Daemon.Current.DaemonConfig.Local.GetMapping(type));
                Log.Logger.Information("BUILDED SCHEMA [{0}] - [{1}]", type.FullName, directionAttribute.Direction);
            }
        }
Ejemplo n.º 2
0
        public static void CheckTrigger(SQLServerConnection Connection, TableMapping Table, int DbVersion)
        {
            int Timeout = 30;

            try
            {
                Timeout = Connection.CommandTimeout;
                Connection.CommandTimeout = (int)TimeSpan.FromMinutes(9).TotalMinutes;

                string TriggerName = $"{Table.TableName}_TRIGGER";

                bool TriggerExists = Connection.TriggerExists(TriggerName);

                SyncVersions version =
                    TriggerExists ?
                    SyncVersions.GetVersion(Connection, TriggerName, SyncVersionObject.Trigger) :
                    new SyncVersions()
                {
                    Name = TriggerName,
                    SyncVersionObject = SyncVersionObject.Trigger
                };

                if (!TriggerExists || !Connection.TableExists(Table.TableName) || version.Version != DbVersion)
                {
                    Connection.CreateTable(Table);
                    if (TriggerExists)
                    {
                        Connection.EXEC($"DROP TRIGGER {TriggerName}", System.Data.CommandType.Text);
                    }

                    string clustered_index_name = $"IX_{Table.TableName}_{ISync.SyncGuidColumnName}";
                    if (!Connection.ExistsClusteredIndex(Table.TableName, clustered_index_name))
                    {
                        Connection.CreateClusteredIndex(Table.TableName, ISync.SyncGuidColumnName, clustered_index_name);
                    }

                    //REMOVE OLD TRIGGERS
                    if (Connection.TriggerExists($"{Table.TableName}_Tablet"))
                    {
                        Connection.EXEC($"DROP TRIGGER {Table.TableName}_Tablet");
                    }

                    Connection.EXEC($@"CREATE TRIGGER dbo.{TriggerName} ON dbo.{Table.TableName} AFTER INSERT,DELETE,UPDATE AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	-- Check if this is an INSERT, UPDATE or DELETE Action.
    DECLARE @action as char(10);
    SET @action = '{NotifyTableChangedAction.Insert}'; -- Set Action to Insert by default.
    IF EXISTS(SELECT * FROM DELETED)
    BEGIN
        SET @action =
            CASE
                WHEN EXISTS(SELECT * FROM INSERTED) THEN '{NotifyTableChangedAction.Update}' -- Set Action to Updated.
                ELSE '{NotifyTableChangedAction.Delete}' -- Set Action to Deleted.
            END
    END
    ELSE
        IF NOT EXISTS(SELECT * FROM INSERTED)
	RETURN;

IF @ACTION='{NotifyTableChangedAction.Insert}' OR @action='{NotifyTableChangedAction.Update}'
BEGIN
DELETE FROM SyncHistory WHERE SyncGuid IN ( SELECT SyncGuid FROM deleted)
DELETE FROM ChangesHistory WHERE SyncGuid IN ( SELECT SyncGuid FROM deleted)
DELETE FROM ChangesHistory WHERE SyncGuid IN ( SELECT SyncGuid FROM inserted)

INSERT INTO ChangesHistory (Action,SyncGuid,TableName,Priority)
SELECT @action,inserted.SyncGuid,'{Table.TableName}',{Table.SyncMode.Order}
FROM inserted 
GROUP BY inserted.SyncGuid
---DEBUG
--SELECT 'INSERT INTO ChangesHistory (Action,SyncGuid,TableName,Priority) VALUES('''
--+RTRIM(LTRIM(@action))+''','''
--+CAST(inserted.SyncGuid AS varchar(MAX))+''',''{Table.TableName}'',{Table.SyncMode.Order})' 
--FROM inserted  GROUP BY inserted.SyncGuid
--DEBUG

END ELSE
BEGIN
DELETE FROM SyncHistory WHERE SyncGuid IN ( SELECT SyncGuid FROM deleted)
DELETE FROM ChangesHistory WHERE SyncGuid IN ( SELECT SyncGuid FROM deleted)
DELETE FROM ChangesHistory WHERE SyncGuid IN ( SELECT SyncGuid FROM inserted)

INSERT INTO ChangesHistory (Action,SyncGuid,TableName,Priority)
SELECT @action,deleted.SyncGuid,'{Table.TableName}',{Table.SyncMode.Order}
FROM deleted 
GROUP BY deleted.SyncGuid
---DEBUG
--SELECT 'INSERT INTO ChangesHistory (Action,SyncGuid,TableName,Priority) VALUES('''
--+RTRIM(LTRIM(@action))+''','''
--+CAST(inserted.SyncGuid AS varchar(MAX))+''',''{Table.TableName}'',{Table.SyncMode.Order})' 
--FROM inserted  GROUP BY inserted.SyncGuid
--DEBUG

END
END", System.Data.CommandType.Text);

                    var last = Table.Columns.LastOrDefault();
                    if (last != null)
                    {
                        using (var con = Connection.Con())
                        {
                            using (var cmd = new System.Data.SqlClient.SqlCommand($"UPDATE {Table.TableName} SET SyncGuid=ISNULL(SyncGuid,NEWID())", con)
                            {
                                CommandTimeout = Int32.MaxValue
                            })
                            {
                                con.Open();
                                cmd.ExecuteNonQuery();
                                con.Close();
                            }
                        }
                    }
                    version.Version = DbVersion;
                    version.Save(Connection);
                }
            }
            catch (Exception ex)
            {
                Log.Logger.Error(ex, $"Al revisar el trigger de {Table.TableName}");
            }
            finally
            {
                Connection.CommandTimeout = Timeout;
            }
        }