コード例 #1
0
ファイル: ConstraintsBuilder.cs プロジェクト: japj/vulcan
        private void Append(ForeignKeyConstraint constraint)
        {
            string strConstraintName;

            if (String.IsNullOrEmpty(constraint.Name) || !constraint.Name.StartsWith("FK_"))
            {
                strConstraintName = String.Format(System.Globalization.CultureInfo.InvariantCulture, "FK_{0}_{1}", constraint.Parent.Name, constraint.Name);
            }
            else
            {
                strConstraintName = constraint.Name;
            }

            if (strConstraintName.Length >= 128)
            {
                strConstraintName = strConstraintName.Substring(0, 127);
            }

            TemplatePlatformEmitter te = new TemplatePlatformEmitter(
                "ForeignKeyConstraintTemplate",
                constraint.Parent.Name,
                strConstraintName,
                new KeysBuilder(constraint.LocalColumnList).BuildForeignKeys(),
                constraint.Table,
                new KeysBuilder(constraint.ForeignColumnList).BuildForeignKeys()
            );
            _stringBuilder.Append(te.Emit(constraint));
            _stringBuilder.Append(NEWLINE);
        }
コード例 #2
0
ファイル: TablePlatformEmitter.cs プロジェクト: japj/vulcan
        public string Emit(Table table)
        {
            string sConstraints = new ConstraintsBuilder(table).BuildConstraints();
            TemplatePlatformEmitter te = new TemplatePlatformEmitter("CreateTable",table.Name,new ColumnsBuilder(table, sConstraints.Length > 0).Build(),sConstraints);

            StringBuilder sTable = new StringBuilder(te.Emit(table));
            sTable.Append(new ConstraintsBuilder(table).BuildForeignKeyConstraints());
            sTable.Append(new IndexesBuilder(table.Indexes).Build());
            sTable.Append(new InsertDefaultValuesEmitter().Emit(table));
            return sTable.ToString();
        }
コード例 #3
0
ファイル: SelectEmitter.cs プロジェクト: japj/vulcan
        public string Emit(string tableName, string columns, string where)
        {
            TemplatePlatformEmitter teSelect = new TemplatePlatformEmitter("SimpleSelect", columns, tableName);
            StringBuilder sSelect = new StringBuilder(teSelect.Emit(null));

            if (!string.IsNullOrEmpty(where))
            {
                TemplatePlatformEmitter teWhere = new TemplatePlatformEmitter("SimpleWhere", where);
                sSelect.Append(teWhere.Emit(null));
            }

            return sSelect.ToString();
        }
コード例 #4
0
ファイル: IndexesBuilder.cs プロジェクト: japj/vulcan
        private void Append(string tableName, Index index)
        {
            string unique = index.Unique ? "UNIQUE" : "";
            string clustered = index.Clustered ? "CLUSTERED" : "NONCLUSTERED";
            string dropExisting = index.DropExisting ? "DROP_EXISTING = ON" : "DROP_EXISTING = OFF";
            string ignoreDupKey = index.IgnoreDupKey ? "IGNORE_DUP_KEY = ON" : "IGNORE_DUP_KEY = OFF";
            string online = index.Online ? "ONLINE = ON" : "ONLINE = OFF";
            string padIndex = index.Online ? "PAD_INDEX = ON" : "PAD_INDEX = OFF";
            string sortInTempdb = index.SortInTempdb ? "SORT_IN_TEMPDB = ON" : "SORT_IN_TEMPDB = OFF";
            string sProperties = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0},\n{1},\n{2},\n{3},\n{4}", padIndex, sortInTempdb, dropExisting, ignoreDupKey, online);
            string kName;
            string keys = new KeysBuilder(index.Keys).Build(index.Name, out kName);

            TemplatePlatformEmitter te = new TemplatePlatformEmitter("CreateIndex", unique, clustered, kName, tableName, keys, sProperties, string.Empty);
            _stringBuilder.Append(te.Emit(index));
            _stringBuilder.Append(NEWLINE);
        }
コード例 #5
0
ファイル: LogPlatformEmitter.cs プロジェクト: mosamy/vulcan
        public string LogStart(SequenceTask logContainer, string packageName, string taskName, string varScopeXML)
        {
            TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogStart", packageName, taskName, varScopeXML);

            return(te.Emit(logContainer));
        }
コード例 #6
0
ファイル: MergeEmitter.cs プロジェクト: mosamy/vulcan
        public string Emit(AstMergeTaskNode mergeTask)
        {
            StringBuilder joinBuilder = new StringBuilder();

            for (int i = 0; i < mergeTask.TargetConstraint.Columns.Count; i++)
            {
                joinBuilder.AppendFormat("TARGET.{0} = SOURCE.{0}", mergeTask.TargetConstraint.Columns[i].Column.Name);
                if (i < mergeTask.TargetConstraint.Columns.Count - 1)
                {
                    joinBuilder.AppendFormat("\nAND\n");
                }
            }

            StringBuilder notEqualBuilder    = new StringBuilder();
            StringBuilder updateBuilder      = new StringBuilder();
            StringBuilder insertParamBuilder = new StringBuilder();
            StringBuilder insertValueBuilder = new StringBuilder();

            AstTableNode targetTable = AstWalker.FirstParent <AstTableNode>(mergeTask.TargetConstraint);

            Hashtable columnUsageMapping = new Hashtable();

            foreach (AstTableColumnBaseNode column in targetTable.Columns)
            {
                if (column.IsAssignable)
                {
                    foreach (AstMergeColumnNode mergeColumn in mergeTask.Columns)
                    {
                        if (mergeColumn.ColumnName.ToUpperInvariant() == column.Name.ToUpperInvariant())
                        {
                            columnUsageMapping.Add(column.Name, mergeColumn.ColumnUsage);
                            break;
                        }
                    }
                    if (!columnUsageMapping.ContainsKey(column.Name))
                    {
                        columnUsageMapping.Add(column.Name, mergeTask.UnspecifiedColumnDefaultUsageType);
                    }
                }
            }

            bool firstNotEqual = true;
            bool firstUpdate   = true;
            bool firstInsert   = true;

            foreach (AstTableColumnBaseNode column in targetTable.Columns)
            {
                if (column.IsAssignable)
                {
                    if (columnUsageMapping[column.Name].ToString().ToUpperInvariant().Contains("COMPARE"))
                    {
                        if (firstNotEqual)
                        {
                            firstNotEqual = false;
                        }
                        else
                        {
                            notEqualBuilder.AppendFormat("\nOR\n");
                        }

                        // Bug #3757, special handling for uniqueidentifier data type
                        if (column.CustomType != null && column.CustomType.ToLowerInvariant().CompareTo("uniqueidentifier") == 0)
                        {
                            notEqualBuilder.AppendFormat("COALESCE(TARGET.[{0}],CONVERT(uniqueidentifier,'00000000-0000-0000-0000-000000000000')) <> COALESCE(SOURCE.[{0}],CONVERT(uniqueidentifier,'00000000-0000-0000-0000-000000000000'))", column.Name);
                        }
                        else
                        {
                            notEqualBuilder.AppendFormat("COALESCE(TARGET.[{0}],'') <> COALESCE(SOURCE.[{0}],'')", column.Name);
                        }
                    }

                    if (columnUsageMapping[column.Name].ToString().ToUpperInvariant().Contains("UPDATE"))
                    {
                        if (firstUpdate)
                        {
                            firstUpdate = false;
                        }
                        else
                        {
                            updateBuilder.AppendFormat(",");
                        }

                        updateBuilder.AppendFormat("TARGET.[{0}] = SOURCE.[{0}]", column.Name);
                    }

                    if (firstInsert)
                    {
                        firstInsert = false;
                    }
                    else
                    {
                        insertParamBuilder.AppendFormat(",\n");
                        insertValueBuilder.AppendFormat(",\n");
                    }

                    insertParamBuilder.AppendFormat("[{0}]", column.Name);
                    insertValueBuilder.AppendFormat("SOURCE.[{0}]", column.Name);
                }
            }

            TemplatePlatformEmitter te;

            if (mergeTask.UpdateTargetTable)
            {
                te = new TemplatePlatformEmitter("Merge", mergeTask.SourceName, targetTable.Name, joinBuilder.ToString(), notEqualBuilder.ToString(), updateBuilder.ToString(), insertParamBuilder.ToString(), insertValueBuilder.ToString());
            }
            else
            {
                te = new TemplatePlatformEmitter("MergeWithoutUpdate", mergeTask.SourceName, targetTable.Name, joinBuilder.ToString(), insertParamBuilder.ToString(), insertValueBuilder.ToString());
            }
            return(te.Emit(null));

            /*
             * <Template Name="Merge">
             * <Map Source="Source" Index="0"/>
             * <Map Source="Target" Index="1"/>
             * <Map Source="Join" Index="2"/>
             * <Map Source="NotEqualCheck" Index="3"/>
             * <Map Source="Update" Index="4"/>
             * <Map Source="Insert" Index="5"/>
             * <TemplateData>
             */
        }
コード例 #7
0
        public static PhysicalTask.SequenceTask Lower(this AstTask.AstStagingContainerTaskNode astNode)
        {
            if (astNode.AsClassOnly)
            {
                return null;
            }

            try
            {
                TSQLEmitter.TemplatePlatformEmitter createStagingTemplate =
                    new Ssis2008Emitter.Emitters.TSQL.PlatformEmitter.TemplatePlatformEmitter("CreateStagingTable", astNode.Table.Name, astNode.CreateAs);

                IR.TSQL.Table table = astNode.Table.Lower();
                table.Indexes.IndexList.Clear();
                //table.ConstraintList.Clear();
                if (astNode.UseStaticSource == false)
                {
                    table.DefaultValues.DefaultValueList.Clear();
                }
                foreach (string s in astNode.DropConstraints)
                {
                    for (int i = 0; i < table.ConstraintList.Count; i++)
                    {
                        if (String.Compare(s.Trim(), table.ConstraintList[i].Name.Trim(), true) == 0)
                        {
                            table.ConstraintList.RemoveAt(i);
                            break;
                        }
                    }
                }

                foreach (IR.TSQL.Constraint constraint in table.ConstraintList)
                {
                    constraint.Name = String.Format("{0}_{1}", astNode.CreateAs, constraint.Name);
                }
                table.ForeignKeyConstraintList.Clear();
                table.Name = astNode.CreateAs;
                table.ConnectionConfiguration = astNode.StagingConnection.Lower();


                AstTask.AstExecuteSQLTaskNode createStagingTask = new VulcanEngine.IR.Ast.Task.AstExecuteSQLTaskNode();

                createStagingTask.ParentASTNode = astNode;
                createStagingTask.Connection = astNode.StagingConnection;
                AddConnection(astNode.StagingConnection);
                createStagingTask.ExecuteDuringDesignTime = true;
                createStagingTask.Name = astNode.Name;
                //createStagingTask.Type = VulcanEngine.IR.Ast.Task.ExecuteSQLTaskType.Expression;
                createStagingTask.Type = VulcanEngine.IR.Ast.Task.ExecuteSQLTaskType.File;
                //createStagingTask.Body = String.Format("\"{0}\"", createStagingTemplate.Emit(null));
                createStagingTask.Body = new TSQLEmitter.TablePlatformEmitter().Emit(table);

                TSQLEmitter.TemplatePlatformEmitter dropStagingTemplate =
                    new Ssis2008Emitter.Emitters.TSQL.PlatformEmitter.TemplatePlatformEmitter("DropStagingTable", astNode.CreateAs);

                AstTask.AstExecuteSQLTaskNode truncateStagingTask = new VulcanEngine.IR.Ast.Task.AstExecuteSQLTaskNode();

                truncateStagingTask.ParentASTNode = astNode;
                truncateStagingTask.Connection = astNode.StagingConnection;
                truncateStagingTask.ExecuteDuringDesignTime = false;
                truncateStagingTask.Name = astNode.Name;
                truncateStagingTask.Type = VulcanEngine.IR.Ast.Task.ExecuteSQLTaskType.Expression;
                truncateStagingTask.Body = String.Format("\"{0}\"", dropStagingTemplate.Emit(null));

                astNode.Tasks.Insert(0, createStagingTask);
                astNode.Tasks.Add(truncateStagingTask);
                return ((AstTask.AstContainerTaskNode)astNode).Lower();
            }
            catch (Exception e)
            {
                throw new SSISEmitterException(astNode, e);
            }
        }
コード例 #8
0
 public string Emit(StoredProc storedProc)
 {
     TemplatePlatformEmitter te = new TemplatePlatformEmitter("StoredProc", storedProc.Name, new StoredProcColumnsBuilder(storedProc.Columns).Build(), storedProc.Body);
     return te.Emit(storedProc);
 }
コード例 #9
0
ファイル: LogPlatformEmitter.cs プロジェクト: mosamy/vulcan
        public string LogSetValue(SequenceTask logContainer, string logIDName, string pathVariable, string nameVariable, string value)
        {
            TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogSetValue", logIDName, pathVariable, nameVariable, value);

            return(te.Emit(logContainer));
        }
コード例 #10
0
        public string Emit(StoredProc storedProc)
        {
            TemplatePlatformEmitter te = new TemplatePlatformEmitter("StoredProc", storedProc.Name, new StoredProcColumnsBuilder(storedProc.Columns).Build(), storedProc.Body);

            return(te.Emit(storedProc));
        }
コード例 #11
0
ファイル: LogPlatformEmitter.cs プロジェクト: japj/vulcan
 public string LogEnd(SequenceTask logContainer, string logIDName)
 {
     TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogEnd", logIDName);
     return te.Emit(logContainer);
 }
コード例 #12
0
ファイル: LogPlatformEmitter.cs プロジェクト: japj/vulcan
 public string LogSetValue(SequenceTask logContainer, string logIDName, string pathVariable, string nameVariable, string value)
 {
     TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogSetValue", logIDName, pathVariable, nameVariable, value);
     return te.Emit(logContainer);
 }
コード例 #13
0
ファイル: LogPlatformEmitter.cs プロジェクト: japj/vulcan
 public string LogPrepareToSetValue(SequenceTask logContainer)
 {
     TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogPrepareToSetValue");
     return te.Emit(logContainer);
 }
コード例 #14
0
ファイル: LogPlatformEmitter.cs プロジェクト: japj/vulcan
 public string LogGetPredefinedValues(SequenceTask logContainer)
 {
     TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogGetPredefinedValues");
     return te.Emit(logContainer);
 }
コード例 #15
0
ファイル: LogPlatformEmitter.cs プロジェクト: japj/vulcan
 public string LogStart(SequenceTask logContainer, string packageName, string taskName, string varScopeXML)
 {
     TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogStart", packageName, taskName, varScopeXML);
     return te.Emit(logContainer);
 }
コード例 #16
0
ファイル: LogPlatformEmitter.cs プロジェクト: mosamy/vulcan
        public string LogGetPredefinedValues(SequenceTask logContainer)
        {
            TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogGetPredefinedValues");

            return(te.Emit(logContainer));
        }
コード例 #17
0
ファイル: LogPlatformEmitter.cs プロジェクト: mosamy/vulcan
        public string LogPrepareToSetValue(SequenceTask logContainer)
        {
            TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogPrepareToSetValue");

            return(te.Emit(logContainer));
        }
コード例 #18
0
ファイル: ConstraintsBuilder.cs プロジェクト: japj/vulcan
        private void AppendConstraintBase(IndexBase constraint, string primaryKeyString, string unique)
        {
            string clustered = constraint.Clustered ? "CLUSTERED" : "NONCLUSTERED";
            string ignoreDupKey = constraint.IgnoreDupKey ? "IGNORE_DUP_KEY = ON" : "IGNORE_DUP_KEY = OFF";
            string padIndex = constraint.PadIndex ? "PAD_INDEX = ON" : "PAD_INDEX = OFF";
            string kName;
            string keys = new KeysBuilder(constraint.Keys).Build(constraint.Name, out kName);

            TemplatePlatformEmitter te = new TemplatePlatformEmitter("ConstraintTemplate", kName, unique + clustered, keys, "WITH(" + padIndex + "," + ignoreDupKey + ")", primaryKeyString);
            _stringBuilder.Append(te.Emit(constraint));
        }
コード例 #19
0
ファイル: LogPlatformEmitter.cs プロジェクト: mosamy/vulcan
        public string LogEnd(SequenceTask logContainer, string logIDName)
        {
            TemplatePlatformEmitter te = new TemplatePlatformEmitter("LogEnd", logIDName);

            return(te.Emit(logContainer));
        }
コード例 #20
0
ファイル: MergeEmitter.cs プロジェクト: japj/vulcan
        public string Emit(AstMergeTaskNode mergeTask)
        {
            StringBuilder joinBuilder = new StringBuilder();
            for (int i = 0; i < mergeTask.TargetConstraint.Columns.Count; i++)
            {
                joinBuilder.AppendFormat("TARGET.{0} = SOURCE.{0}", mergeTask.TargetConstraint.Columns[i].Column.Name);
                if (i < mergeTask.TargetConstraint.Columns.Count - 1)
                {
                    joinBuilder.AppendFormat("\nAND\n");
                }
            }

            StringBuilder notEqualBuilder = new StringBuilder();
            StringBuilder updateBuilder = new StringBuilder();
            StringBuilder insertParamBuilder = new StringBuilder();
            StringBuilder insertValueBuilder = new StringBuilder();

            AstTableNode targetTable = AstWalker.FirstParent<AstTableNode>(mergeTask.TargetConstraint);

            Hashtable columnUsageMapping = new Hashtable();
            foreach (AstTableColumnBaseNode column in targetTable.Columns)
            {
                if (column.IsAssignable)
                {
                    foreach (AstMergeColumnNode mergeColumn in mergeTask.Columns)
                    {
                        if (mergeColumn.ColumnName.ToUpperInvariant() == column.Name.ToUpperInvariant())
                        {
                            columnUsageMapping.Add(column.Name, mergeColumn.ColumnUsage);
                            break;
                        }
                    }
                    if (!columnUsageMapping.ContainsKey(column.Name))
                    {
                        columnUsageMapping.Add(column.Name, mergeTask.UnspecifiedColumnDefaultUsageType);
                    }
                }
            }

            bool firstNotEqual = true;
            bool firstUpdate = true;
            bool firstInsert = true;

            foreach (AstTableColumnBaseNode column in targetTable.Columns)
            {
                if (column.IsAssignable)
                {
                    if (columnUsageMapping[column.Name].ToString().ToUpperInvariant().Contains("COMPARE"))
                    {
                        if (firstNotEqual)
                        {
                            firstNotEqual = false;
                        }
                        else
                        {
                            notEqualBuilder.AppendFormat("\nOR\n");
                        }

                        // Bug #3757, special handling for uniqueidentifier data type
                        if (column.CustomType != null && column.CustomType.ToLowerInvariant().CompareTo("uniqueidentifier") == 0)
                        {
                            notEqualBuilder.AppendFormat("COALESCE(TARGET.[{0}],CONVERT(uniqueidentifier,'00000000-0000-0000-0000-000000000000')) <> COALESCE(SOURCE.[{0}],CONVERT(uniqueidentifier,'00000000-0000-0000-0000-000000000000'))", column.Name);
                        }
                        else
                        {
                            notEqualBuilder.AppendFormat("COALESCE(TARGET.[{0}],'') <> COALESCE(SOURCE.[{0}],'')", column.Name);
                        }
                    }

                    if (columnUsageMapping[column.Name].ToString().ToUpperInvariant().Contains("UPDATE"))
                    {
                        if (firstUpdate)
                        {
                            firstUpdate = false;
                        }
                        else
                        {
                            updateBuilder.AppendFormat(",");
                        }

                        updateBuilder.AppendFormat("TARGET.[{0}] = SOURCE.[{0}]", column.Name);
                    }

                    if (firstInsert)
                    {
                        firstInsert = false;
                    }
                    else
                    {
                        insertParamBuilder.AppendFormat(",\n");
                        insertValueBuilder.AppendFormat(",\n");
                    }

                    insertParamBuilder.AppendFormat("[{0}]", column.Name);
                    insertValueBuilder.AppendFormat("SOURCE.[{0}]", column.Name);
                }
            }

            TemplatePlatformEmitter te;
            if (mergeTask.UpdateTargetTable)
            {
                te = new TemplatePlatformEmitter("Merge", mergeTask.SourceName, targetTable.Name, joinBuilder.ToString(), notEqualBuilder.ToString(), updateBuilder.ToString(), insertParamBuilder.ToString(), insertValueBuilder.ToString());
            }
            else
            {
                te = new TemplatePlatformEmitter("MergeWithoutUpdate", mergeTask.SourceName, targetTable.Name, joinBuilder.ToString(), insertParamBuilder.ToString(), insertValueBuilder.ToString());
            }
            return te.Emit(null);

            /*
              <Template Name="Merge">
    <Map Source="Source" Index="0"/>
    <Map Source="Target" Index="1"/>
    <Map Source="Join" Index="2"/>
    <Map Source="NotEqualCheck" Index="3"/>
    <Map Source="Update" Index="4"/>
    <Map Source="Insert" Index="5"/>
    <TemplateData>
             */
        }