public TableTSqlEmitter(string name, string compressionType) { _name = name; _compressionType = compressionType; _columnsEmitter = new ColumnsTSqlEmitter(); _constraintEmitter = new ConstraintTSqlEmitter(); }
private static string BuildKeys(AST.Table.AstTableKeyBaseNode keyBase) { var keyBuilder = new StringBuilder(); foreach (AST.Table.AstTableKeyColumnNode columnNode in keyBase.Columns) { ColumnsTSqlEmitter.CheckAndAppendSeparator(",", keyBuilder); keyBuilder.AppendFormat(CultureInfo.InvariantCulture, "[{0}] {1}", columnNode.Column.Name, columnNode.SortOrder); } return(keyBuilder.ToString()); }
private static void BindTableReference(AstTableNode tableNode, string refName, AstTableNode refTable, bool nullable, ColumnsTSqlEmitter columnsEmitter) { // TODO: This is wrong in general. We need to ensure that this is always a single column constraint AstTableKeyBaseNode primaryKey = refTable.PreferredKey; if (primaryKey == null) { MessageEngine.Trace(tableNode, Severity.Warning, "V0243", "Table {0} lacks a primary, identity, or unique key", tableNode.Name); return; } // TODO: We currently support only a single primary key column. This should be fixed :) foreach (AstTableKeyColumnNode keyCol in primaryKey.Columns) { string type = TSqlTypeTranslator.Translate( keyCol.Column.ColumnType, keyCol.Column.Length, keyCol.Column.Precision, keyCol.Column.Scale, keyCol.Column.CustomType); columnsEmitter.AddColumn(refName, type, false, 0, 0, nullable, keyCol.Column.Default, false, String.Empty); } }
// This needs its own emitter private static void ProcessAstTableColumnBaseNode(AstTableNode tableNode, ColumnsTSqlEmitter columnsEmitter, AstTableColumnBaseNode columnBase) { var tableReference = columnBase as AstTableColumnTableReferenceNode; var dimReference = columnBase as AstTableColumnDimensionReferenceNode; var hashKey = columnBase as AstTableHashedKeyColumnNode; if (hashKey != null) { var hashBytesBuilder = new StringBuilder(); foreach (AstTableKeyColumnNode keyColumn in hashKey.Constraint.Columns) { string expression = "+ HASHBYTES('SHA1',{0})"; switch (keyColumn.Column.ColumnType) { case ColumnType.AnsiString: case ColumnType.AnsiStringFixedLength: case ColumnType.String: case ColumnType.StringFixedLength: expression = String.Format(CultureInfo.InvariantCulture, expression, String.Format(CultureInfo.InvariantCulture, "UPPER(RTRIM(LTRIM([{0}])))", keyColumn.Column.Name)); break; case ColumnType.Int16: case ColumnType.Int32: case ColumnType.Int64: case ColumnType.UInt16: case ColumnType.UInt32: case ColumnType.UInt64: expression = String.Format(CultureInfo.InvariantCulture, expression, String.Format(CultureInfo.InvariantCulture, "CONVERT(binary varying(64),{0})", keyColumn.Column.Name)); break; default: expression = String.Format(CultureInfo.InvariantCulture, expression, keyColumn.Column.Name); break; } hashBytesBuilder.Append(expression); } string hashExpression = String.Format(CultureInfo.InvariantCulture, "(CONVERT(varbinary(32),HASHBYTES('SHA1',{0})))", hashBytesBuilder.ToString().Substring(1)); hashExpression = String.Format(CultureInfo.InvariantCulture, "{0} PERSISTED NOT NULL UNIQUE", hashExpression); columnsEmitter.AddColumn(hashKey.Name, null, false, 0, 0, true, string.Empty, true, hashExpression); } else if (tableReference != null) { BindTableReference(tableNode, tableReference.Name, tableReference.Table, tableReference.IsNullable, columnsEmitter); } else if (dimReference != null) { BindTableReference(tableNode, dimReference.Name, dimReference.Dimension, dimReference.IsNullable, columnsEmitter); } else if (columnBase != null) { string type = TSqlTypeTranslator.Translate(columnBase.ColumnType, columnBase.Length, columnBase.Precision, columnBase.Scale, columnBase.CustomType); bool identity = false; int seed = 1; int increment = 1; foreach (AstTableKeyBaseNode keyBase in tableNode.Keys) { var identityNode = keyBase as AstTableIdentityNode; if (identityNode != null) { foreach (AstTableKeyColumnNode keyColNode in identityNode.Columns) { if (keyColNode.Column.Name.Equals(columnBase.Name, StringComparison.OrdinalIgnoreCase)) { identity = true; seed = identityNode.Seed; increment = identityNode.Increment; } } } } columnsEmitter.AddColumn(columnBase.Name, type, identity, seed, increment, columnBase.IsNullable, columnBase.Default, columnBase.IsComputed, columnBase.Computed); } }