aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Tango.MachineStudio.Updater/App.config
blob: 8324aa6ff159e0630b9811cf7d53f09b4b8adf91 (plain)
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
    </startup>
</configuration>
{ color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
using System;
using System.Collections.Generic;
using System.Text;

namespace Tango.Synchronization.Conversion
{
    
    public static class TriggerBuilder
    {
        public static IList<TriggerSchema> GetForeignKeyTriggers(TableSchema dt)
        {
            IList<TriggerSchema> result = new List<TriggerSchema>();

            foreach (ForeignKeySchema fks in dt.ForeignKeys)
            {
                StringBuilder sb = new StringBuilder();
                result.Add(GenerateInsertTrigger(fks));
                result.Add(GenerateUpdateTrigger(fks));
                result.Add(GenerateDeleteTrigger(fks));
            }
            return result;
        }

        private static string MakeTriggerName(ForeignKeySchema fks, string prefix)
        {
            return prefix + "_"+fks.TableName + "_" + fks.ColumnName + "_" + fks.ForeignTableName + "_" + fks.ForeignColumnName;
        }

        public static TriggerSchema GenerateInsertTrigger(ForeignKeySchema fks)
        {
            TriggerSchema trigger = new TriggerSchema();
            trigger.Name = MakeTriggerName(fks, "fki");
            trigger.Type = TriggerType.Before;
            trigger.Event = TriggerEvent.Insert;
            trigger.Table = fks.TableName;

            string nullString = "";
            if (fks.IsNullable)
            { 
                nullString = " NEW." + fks.ColumnName + " IS NOT NULL AND";
            }
             
            trigger.Body = "SELECT RAISE(ROLLBACK, 'insert on table " + fks.TableName +
                          " violates foreign key constraint " + trigger.Name + "')" +
                          " WHERE" + nullString + " (SELECT " + fks.ForeignColumnName +
                          " FROM " + fks.ForeignTableName + " WHERE " + fks.ForeignColumnName + " = NEW." +
                          fks.ColumnName +
                          ") IS NULL; " ;
            return trigger;
        }

        public static TriggerSchema GenerateUpdateTrigger(ForeignKeySchema fks)
        {
            TriggerSchema trigger = new TriggerSchema();
            trigger.Name = MakeTriggerName(fks, "fku");
            trigger.Type = TriggerType.Before;
            trigger.Event = TriggerEvent.Update;
            trigger.Table = fks.TableName;

            string triggerName = trigger.Name;
            string nullString = "";
            if (fks.IsNullable)
            {
                nullString = " NEW." + fks.ColumnName + " IS NOT NULL AND";
            }

            trigger.Body = "SELECT RAISE(ROLLBACK, 'update on table " + fks.TableName +
                                  " violates foreign key constraint " + triggerName + "')" +
                                  " WHERE" + nullString + " (SELECT " + fks.ForeignColumnName +
                                  " FROM " + fks.ForeignTableName + " WHERE " + fks.ForeignColumnName + " = NEW." +
                                  fks.ColumnName +
                                  ") IS NULL; ";

            return trigger;
        }

        public static TriggerSchema GenerateDeleteTrigger(ForeignKeySchema fks)
        {
            TriggerSchema trigger = new TriggerSchema();
            trigger.Name = MakeTriggerName(fks, "fkd");
            trigger.Type = TriggerType.Before;
            trigger.Event = TriggerEvent.Delete;
            trigger.Table = fks.ForeignTableName;

            string triggerName = trigger.Name;
            
            if (!fks.CascadeOnDelete)
            {
                trigger.Body = "SELECT RAISE(ROLLBACK, 'delete on table " + fks.ForeignTableName +
                                      " violates foreign key constraint " + triggerName + "')" +
                                      " WHERE (SELECT " + fks.ColumnName +
                                      " FROM " + fks.TableName + " WHERE " + fks.ColumnName + " = OLD." +
                                      fks.ForeignColumnName +
                                      ") IS NOT NULL; ";
            }
            else
            {
                trigger.Body = "DELETE FROM [" + fks.TableName + "] WHERE " + fks.ColumnName + " = OLD." +
                                      fks.ForeignColumnName + "; ";
                              
            }
            return trigger;
        }
    }
}