Example #1
0
        protected virtual void WriteForeignKeyConstraintScriptFragment(StringBuilder sb, ForeignKeyMold foreignKey)
        {
            var decoratedConstraintName = this.Dialect.DecorateIdentifier(
                DbIdentifierType.Constraint,
                foreignKey.Name,
                this.CurrentOpeningIdentifierDelimiter);

            sb.Append($"CONSTRAINT {decoratedConstraintName} FOREIGN KEY(");
            this.WriteDecoratedColumnsOverCommaScriptFragment(sb, foreignKey.ColumnNames);
            sb.Append(") REFERENCES ");

            var decoratedReferencedTableName = this.Dialect.DecorateIdentifier(
                DbIdentifierType.Table,
                foreignKey.ReferencedTableName,
                this.CurrentOpeningIdentifierDelimiter);

            sb.Append(decoratedReferencedTableName);
            sb.Append("(");
            this.WriteDecoratedColumnsOverCommaScriptFragment(sb, foreignKey.ReferencedColumnNames);
            sb.Append(")");
        }
Example #2
0
        private void ChargeRoot(INode root)
        {
            var allSqlNodes = root.FetchTree();

            var exactTextNodes = allSqlNodes
                                 .Where(x => x is ExactTextNode)
                                 .Cast <ExactTextNode>()
                                 .ToList();

            var reservedWords = exactTextNodes
                                .Select(x => x.ExactText)
                                .Distinct()
                                .Select(x => x.ToUpperInvariant())
                                .ToHashSet();

            var identifiersAsWords = allSqlNodes
                                     .Where(x =>
                                            x is TextNode textNode &&
                                            x.Name.EndsWith("-name", StringComparison.InvariantCultureIgnoreCase))
                                     .Cast <TextNode>()
                                     .ToList();

            #region assign job to nodes

            // table
            var createTable = (ActionNode)allSqlNodes.Single(x =>
                                                             string.Equals(x.Name, "do-create-table", StringComparison.InvariantCultureIgnoreCase));
            createTable.Action = (node, token, accumulator) =>
            {
                var tableMold = new TableMold();
                accumulator.AddResult(tableMold);
            };

            var tableName = (ActionNode)allSqlNodes.Single(x =>
                                                           string.Equals(x.Name, "table-name", StringComparison.InvariantCultureIgnoreCase));
            tableName.Action = (node, token, accumulator) =>
            {
                var tableMold = accumulator.GetLastResult <TableMold>();
                tableMold.Name = ((TextToken)token).Text;
            };

            var columnName = (ActionNode)allSqlNodes.Single(x =>
                                                            string.Equals(x.Name, "column-name", StringComparison.InvariantCultureIgnoreCase));
            columnName.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = new ColumnMold
                {
                    Name = ((TextToken)token).Text,
                };
                tableMold.Columns.Add(columnMold);
            };

            var typeName = (ActionNode)allSqlNodes.Single(x =>
                                                          string.Equals(x.Name, "type-name", StringComparison.InvariantCultureIgnoreCase));
            typeName.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.Type.Name = ((TextToken)token).Text;
            };

            var precision = (ActionNode)allSqlNodes.Single(x =>
                                                           string.Equals(x.Name, "precision", StringComparison.InvariantCultureIgnoreCase));
            precision.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.Type.Precision = ((IntegerToken)token).Value.ToInt32();
            };

            var scale = (ActionNode)allSqlNodes.Single(x =>
                                                       string.Equals(x.Name, "scale", StringComparison.InvariantCultureIgnoreCase));
            scale.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.Type.Scale = ((IntegerToken)token).Value.ToInt32();
            };

            var nullToken = (ActionNode)allSqlNodes.Single(x =>
                                                           string.Equals(x.Name, "null", StringComparison.InvariantCultureIgnoreCase));
            nullToken.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.IsNullable = true;
            };

            var notNullToken = (ActionNode)allSqlNodes.Single(x =>
                                                              string.Equals(x.Name, "not-null", StringComparison.InvariantCultureIgnoreCase));
            notNullToken.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.IsNullable = false;
            };

            var inlinePrimaryKey = (ActionNode)allSqlNodes.Single(x =>
                                                                  string.Equals(x.Name, "inline-primary-key", StringComparison.InvariantCultureIgnoreCase));

            inlinePrimaryKey.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.MarkAsExplicitPrimaryKey();
            };

            var autoincrement = (ActionNode)allSqlNodes.Single(x =>
                                                               string.Equals(x.Name, "autoincrement", StringComparison.InvariantCultureIgnoreCase));
            autoincrement.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.Identity = new ColumnIdentityMold();
            };

            var defaultNull = (ActionNode)allSqlNodes.Single(x =>
                                                             string.Equals(x.Name, "default-null", StringComparison.InvariantCultureIgnoreCase));
            defaultNull.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.Default = "NULL";
            };

            var defaultInteger = (ActionNode)allSqlNodes.Single(x =>
                                                                string.Equals(x.Name, "default-integer", StringComparison.InvariantCultureIgnoreCase));
            defaultInteger.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.Default = ((IntegerToken)token).Value;
            };

            var defaultString = (ActionNode)allSqlNodes.Single(x =>
                                                               string.Equals(x.Name, "default-string", StringComparison.InvariantCultureIgnoreCase));
            defaultString.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var columnMold = tableMold.Columns.Last();
                columnMold.Default = $"'{((TextToken)token).Text}'";
            };

            var constraintName = (ActionNode)allSqlNodes.Single(x =>
                                                                string.Equals(x.Name, "constraint-name", StringComparison.InvariantCultureIgnoreCase));
            constraintName.Action = (node, token, accumulator) =>
            {
                var tableMold = accumulator.GetLastResult <TableMold>();
                tableMold.SetLastConstraintName(((TextToken)token).Text);
            };

            var pk = (ActionNode)allSqlNodes.Single(x =>
                                                    string.Equals(x.Name, "do-primary-key", StringComparison.InvariantCultureIgnoreCase));
            pk.Action = (node, token, accumulator) =>
            {
                var tableMold = accumulator.GetLastResult <TableMold>();
                tableMold.PrimaryKey = new PrimaryKeyMold
                {
                    Name = tableMold.GetLastConstraintName(),
                };
            };

            var pkColumnName = (ActionNode)allSqlNodes.Single(x =>
                                                              string.Equals(x.Name, "pk-column-name", StringComparison.InvariantCultureIgnoreCase));
            pkColumnName.Action = (node, token, accumulator) =>
            {
                var tableMold   = accumulator.GetLastResult <TableMold>();
                var primaryKey  = tableMold.PrimaryKey;
                var indexColumn = new IndexColumnMold
                {
                    Name = ((TextToken)token).Text,
                };
                primaryKey.Columns.Add(indexColumn);
            };

            var pkColumnAscOrDesc = (ActionNode)allSqlNodes.Single(x =>
                                                                   string.Equals(x.Name, "pk-asc-or-desc", StringComparison.InvariantCultureIgnoreCase));
            pkColumnAscOrDesc.Action = (node, token, accumulator) =>
            {
                var tableInfo   = accumulator.GetLastResult <TableMold>();
                var primaryKey  = tableInfo.PrimaryKey;
                var indexColumn = primaryKey.Columns.Last();

                var ascOrDesc = ((TextToken)token).Text.ToLowerInvariant();
                indexColumn.SortDirection = SQLiteParsingHelper.SqlToSortDirection(ascOrDesc);
            };

            var fk = (ActionNode)allSqlNodes.Single(x =>
                                                    string.Equals(x.Name, "do-foreign-key", StringComparison.InvariantCultureIgnoreCase));
            fk.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var foreignKey = new ForeignKeyMold
                {
                    Name = tableMold.GetLastConstraintName(),
                };
                tableMold.ForeignKeys.Add(foreignKey);
            };

            var fkTableName = (ActionNode)allSqlNodes.Single(x =>
                                                             string.Equals(x.Name, "fk-referenced-table-name", StringComparison.InvariantCultureIgnoreCase));
            fkTableName.Action = (node, token, accumulator) =>
            {
                var tableMold           = accumulator.GetLastResult <TableMold>();
                var foreignKey          = tableMold.ForeignKeys.Last();
                var foreignKeyTableName = ((TextToken)token).Text;
                foreignKey.ReferencedTableName = foreignKeyTableName;
            };

            var fkColumnName = (ActionNode)allSqlNodes.Single(x =>
                                                              string.Equals(x.Name, "fk-column-name", StringComparison.InvariantCultureIgnoreCase));
            fkColumnName.Action = (node, token, accumulator) =>
            {
                var tableMold            = accumulator.GetLastResult <TableMold>();
                var foreignKey           = tableMold.ForeignKeys.Last();
                var foreignKeyColumnName = ((TextToken)token).Text;
                foreignKey.ColumnNames.Add(foreignKeyColumnName);
            };

            var fkReferencedColumnName = (ActionNode)allSqlNodes.Single(x =>
                                                                        string.Equals(x.Name, "fk-referenced-column-name", StringComparison.InvariantCultureIgnoreCase));
            fkReferencedColumnName.Action = (node, token, accumulator) =>
            {
                var tableMold  = accumulator.GetLastResult <TableMold>();
                var foreignKey = tableMold.ForeignKeys.Last();
                var foreignKeyReferencedColumnName = ((TextToken)token).Text;
                foreignKey.ReferencedColumnNames.Add(foreignKeyReferencedColumnName);
            };

            // index
            var createUniqueIndex = (ActionNode)allSqlNodes.Single(x =>
                                                                   string.Equals(x.Name, "do-create-unique-index", StringComparison.InvariantCultureIgnoreCase));
            createUniqueIndex.Action = (node, token, accumulator) =>
            {
                var index = new IndexMold
                {
                    IsUnique = true,
                };
                index.SetIsCreationFinalized(false);
                accumulator.AddResult(index);
            };

            var createIndex = (ActionNode)allSqlNodes.Single(x =>
                                                             string.Equals(x.Name, "do-create-index", StringComparison.InvariantCultureIgnoreCase));
            createIndex.Action = (node, token, accumulator) =>
            {
                bool brandNewIndex;

                if (accumulator.Count == 0)
                {
                    brandNewIndex = true;
                }
                else
                {
                    var result = accumulator.Last();
                    if (result is IndexMold indexMold)
                    {
                        brandNewIndex = indexMold.GetIsCreationFinalized();
                    }
                    else
                    {
                        brandNewIndex = true;
                    }
                }

                if (brandNewIndex)
                {
                    var newIndex = new IndexMold();
                    newIndex.SetIsCreationFinalized(true);
                    accumulator.AddResult(newIndex);
                }
                else
                {
                    var existingIndexMold = accumulator.GetLastResult <IndexMold>();
                    existingIndexMold.SetIsCreationFinalized(true);
                }
            };

            var indexName = (ActionNode)allSqlNodes.Single(x =>
                                                           string.Equals(x.Name, "index-name", StringComparison.InvariantCultureIgnoreCase));
            indexName.Action = (node, token, accumulator) =>
            {
                var index = accumulator.GetLastResult <IndexMold>();
                index.Name = ((TextToken)token).Text;
            };

            var indexTableName = (ActionNode)allSqlNodes.Single(x =>
                                                                string.Equals(x.Name, "index-table-name", StringComparison.InvariantCultureIgnoreCase));
            indexTableName.Action = (node, token, accumulator) =>
            {
                var index = accumulator.GetLastResult <IndexMold>();
                index.TableName = ((TextToken)token).Text;
            };

            var indexColumnName = (ActionNode)allSqlNodes.Single(x =>
                                                                 string.Equals(x.Name, "index-column-name", StringComparison.InvariantCultureIgnoreCase));
            indexColumnName.Action = (node, token, accumulator) =>
            {
                var index      = accumulator.GetLastResult <IndexMold>();
                var columnMold = new IndexColumnMold
                {
                    Name = ((TextToken)token).Text,
                };
                index.Columns.Add(columnMold);
            };

            var indexColumnAscOrDesc = (ActionNode)allSqlNodes.Single(x =>
                                                                      string.Equals(x.Name, "index-column-asc-or-desc", StringComparison.InvariantCultureIgnoreCase));
            indexColumnAscOrDesc.Action = (node, token, accumulator) =>
            {
                var index      = accumulator.GetLastResult <IndexMold>();
                var columnInfo = index.Columns.Last();

                var ascOrDesc = ((TextToken)token).Text.ToLowerInvariant();
                columnInfo.SortDirection = SQLiteParsingHelper.SqlToSortDirection(ascOrDesc);
            };

            #endregion

            foreach (var identifiersAsWord in identifiersAsWords)
            {
                identifiersAsWord.AdditionalChecker = (token, accumulator) =>
                {
                    var wordToken = ((TextToken)token).Text.ToUpperInvariant();
                    return(!reservedWords.Contains(wordToken));
                };
            }
        }