public override void Emit(TextWriter outputWriter) { if (TableNavigator.Select("rc:DefaultValues/rc:Value", VulcanPackage.VulcanConfig.NamespaceManager).Count == 0) { outputWriter.Flush(); return; } StringBuilder columnBuilder = new StringBuilder(); bool containsIdentities = _tableHelper.KeyColumnType == KeyColumnType.Identity; foreach (XPathNavigator nav in TableNavigator.Select("rc:Columns/rc:Column", VulcanPackage.VulcanConfig.NamespaceManager)) { /* Build Column List */ string columnName = nav.SelectSingleNode("@Name", VulcanPackage.VulcanConfig.NamespaceManager).Value; columnBuilder.AppendFormat( "[{0}],", columnName ); } columnBuilder.Remove(columnBuilder.Length - 1, 1); if (containsIdentities) { outputWriter.Write("\n"); outputWriter.Write(String.Format(System.Globalization.CultureInfo.InvariantCulture, "\nSET IDENTITY_INSERT {0} ON\n", TableName)); } TemplateEmitter te = new TemplateEmitter("InsertDefaultValues", VulcanPackage, null); outputWriter.Write("\n"); foreach (XPathNavigator nav in TableNavigator.Select("rc:DefaultValues/rc:Value", VulcanPackage.VulcanConfig.NamespaceManager)) { te.SetParameters(TableName, columnBuilder.ToString(), nav.Value); te.Emit(outputWriter); outputWriter.Write("\n");; } if (containsIdentities) { outputWriter.Write(String.Format(System.Globalization.CultureInfo.InvariantCulture, "\nSET IDENTITY_INSERT {0} OFF", TableName)); } outputWriter.Write("\nGO\n"); outputWriter.Flush(); }
public override void Emit(TextWriter outputWriter) { TemplateEmitter te = new TemplateEmitter("CreateIndex", VulcanPackage, null); foreach (XPathNavigator nav in TableNavigator.Select("rc:Indexes/rc:Index", VulcanPackage.VulcanConfig.NamespaceManager)) { string indexName = nav.SelectSingleNode("@Name") == null ? null : nav.SelectSingleNode("@Name").Value; string unique = nav.SelectSingleNode("@Unique", VulcanPackage.VulcanConfig.NamespaceManager).ValueAsBoolean ? "UNIQUE" : ""; string clustered = nav.SelectSingleNode("@Clustered", VulcanPackage.VulcanConfig.NamespaceManager).ValueAsBoolean ? "CLUSTERED" : "NONCLUSTERED"; string dropExisting = nav.SelectSingleNode("@DropExisting", VulcanPackage.VulcanConfig.NamespaceManager).ValueAsBoolean ? "DROP_EXISTING = ON" : "DROP_EXISTING = OFF"; string ignoreDupKey = nav.SelectSingleNode("@IgnoreDupKey", VulcanPackage.VulcanConfig.NamespaceManager).ValueAsBoolean ? "IGNORE_DUP_KEY = ON" : "IGNORE_DUP_KEY = OFF"; string online = nav.SelectSingleNode("@Online", VulcanPackage.VulcanConfig.NamespaceManager).ValueAsBoolean ? "ONLINE = ON" : "ONLINE = OFF"; string padIndex = nav.SelectSingleNode("@PadIndex", VulcanPackage.VulcanConfig.NamespaceManager).ValueAsBoolean ? "PAD_INDEX = ON" : "PAD_INDEX = OFF"; string sortInTempdb = nav.SelectSingleNode("@SortInTempdb", VulcanPackage.VulcanConfig.NamespaceManager).ValueAsBoolean ? "SORT_IN_TEMPDB = ON" : "SORT_IN_TEMPDB = OFF"; StringBuilder columnsBuilder = new StringBuilder(); StringBuilder indexNameBuilder = new StringBuilder("IX_"); indexNameBuilder.Append(TableName); outputWriter.Write("\n"); foreach (XPathNavigator columnNav in nav.Select("rc:Column", VulcanPackage.VulcanConfig.NamespaceManager)) { // This should use a Column Emitter which has callbacks and such... //string componentName = nav.SelectSingleNode("@Name", VulcanPackage.NamespaceManager).Value; string name = columnNav.SelectSingleNode("@Name", VulcanPackage.VulcanConfig.NamespaceManager).Value; string sortOrder = columnNav.SelectSingleNode("@SortOrder", VulcanPackage.VulcanConfig.NamespaceManager).Value; columnsBuilder.AppendFormat( "[{0}] {1},\n", name, sortOrder ); indexNameBuilder.AppendFormat("_{0}", name); } columnsBuilder.Replace(",", "", columnsBuilder.Length - 2, 1); // Remove any dots which happen to show up in the name indexNameBuilder.Replace(".", "_"); if (!string.IsNullOrEmpty(indexName)) { indexNameBuilder = new StringBuilder(indexName); // Throw out the old name :) We got ourselves a better one. } te.SetParameters( unique, clustered, indexNameBuilder.ToString(), TableName, columnsBuilder.ToString(), String.Format(System.Globalization.CultureInfo.InvariantCulture, "{0},\n{1},\n{2},\n{3},\n{4}", padIndex, sortInTempdb, dropExisting, ignoreDupKey, online) ); te.Emit(outputWriter); outputWriter.Flush(); } }