Tup.Cobar4Net.Parser.Recognizer.Mysql.Syntax.MySqlDdlParser.TableOption C# (CSharp) Метод

TableOption() приватный Метод

private TableOption ( TableOptions options ) : bool
options Tup.Cobar4Net.Parser.Ast.Fragment.Ddl.TableOptions
Результат bool
        private bool TableOption(DdlTableOptions options)
        {
            Identifier id = null;
            IExpression expr = null;
            switch (lexer.Token())
            {
                case MySqlToken.KwCharacter:
                {
                    lexer.NextToken();
                    Match(MySqlToken.KwSet);
                    if (lexer.Token() == MySqlToken.OpEquals)
                    {
                        lexer.NextToken();
                    }
                    id = Identifier();
                    options.CharSet = id;
                    break;
                }

                case MySqlToken.KwCollate:
                {
                    lexer.NextToken();
                    if (lexer.Token() == MySqlToken.OpEquals)
                    {
                        lexer.NextToken();
                    }
                    id = Identifier();
                    options.Collation = id;
                    break;
                }

                case MySqlToken.KwDefault:
                {
                    switch (lexer.NextToken())
                    {
                        case MySqlToken.KwCharacter:
                        {
                            // | [DEFAULT] CHARSET [=] charset_name { MySql 5.1 legacy}
                            // | [DEFAULT] CHARACTER SET [=] charset_name
                            // | [DEFAULT] COLLATE [=] collation_name
                            lexer.NextToken();
                            Match(MySqlToken.KwSet);
                            if (lexer.Token() == MySqlToken.OpEquals)
                            {
                                lexer.NextToken();
                            }
                            id = Identifier();
                            options.CharSet = id;
                            goto os_break;
                        }

                        case MySqlToken.KwCollate:
                        {
                            lexer.NextToken();
                            if (lexer.Token() == MySqlToken.OpEquals)
                            {
                                lexer.NextToken();
                            }
                            id = Identifier();
                            options.Collation = id;
                            goto os_break;
                        }

                        case MySqlToken.Identifier:
                        {
                            var si = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
                            if (si != SpecialIdentifier.None)
                            {
                                switch (si)
                                {
                                    case SpecialIdentifier.Charset:
                                    {
                                        lexer.NextToken();
                                        if (lexer.Token() == MySqlToken.OpEquals)
                                        {
                                            lexer.NextToken();
                                        }
                                        id = Identifier();
                                        options.CharSet = id;
                                        goto os_break;
                                    }
                                }
                            }
                            goto default;
                        }

                        default:
                        {
                            lexer.AddCacheToke(MySqlToken.KwDefault);
                            return false;
                        }
                    }
                    //goto case MySqlToken.KwIndex;
                }

                case MySqlToken.KwIndex:
                {
                    // | INDEX DIRECTORY [=] 'absolute path to directory'
                    lexer.NextToken();
                    if (lexer.Token() == MySqlToken.Identifier && "DIRECTORY".Equals(lexer.GetStringValueUppercase()))
                    {
                        if (lexer.NextToken() == MySqlToken.OpEquals)
                        {
                            lexer.NextToken();
                        }
                        options.IndexDir = (LiteralString)exprParser.Expression();
                        break;
                    }
                    lexer.AddCacheToke(MySqlToken.KwIndex);
                    return true;
                }

                case MySqlToken.KwUnion:
                {
                    // | UNION [=] (tbl_name[,tbl_name]...)
                    if (lexer.NextToken() == MySqlToken.OpEquals)
                    {
                        lexer.NextToken();
                    }
                    Match(MySqlToken.PuncLeftParen);
                    IList<Identifier> union = new List<Identifier>(2);
                    for (var j = 0; lexer.Token() != MySqlToken.PuncRightParen; ++j)
                    {
                        if (j > 0)
                        {
                            Match(MySqlToken.PuncComma);
                        }
                        id = Identifier();
                        union.Add(id);
                    }
                    Match(MySqlToken.PuncRightParen);
                    options.Union = union;
                    goto os_break;
                }

                case MySqlToken.Identifier:
                {
                    var si_1 = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
                    if (si_1 != SpecialIdentifier.None)
                    {
                        switch (si_1)
                        {
                            case SpecialIdentifier.Charset:
                            {
                                // CHARSET [=] charset_name
                                lexer.NextToken();
                                if (lexer.Token() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                id = Identifier();
                                options.CharSet = id;
                                goto os_break;
                            }

                            case SpecialIdentifier.Engine:
                            {
                                // ENGINE [=] engine_name
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                id = Identifier();
                                options.Engine = id;
                                goto os_break;
                            }

                            case SpecialIdentifier.AutoIncrement:
                            {
                                // | AUTO_INCREMENT [=] value
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                expr = exprParser.Expression();
                                options.AutoIncrement = expr;
                                goto os_break;
                            }

                            case SpecialIdentifier.AvgRowLength:
                            {
                                // | AVG_ROW_LENGTH [=] value
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                expr = exprParser.Expression();
                                options.AvgRowLength = expr;
                                goto os_break;
                            }

                            case SpecialIdentifier.Checksum:
                            {
                                // | CHECKSUM [=] {0 | 1}
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                switch (lexer.Token())
                                {
                                    case MySqlToken.LiteralBoolFalse:
                                    {
                                        lexer.NextToken();
                                        options.CheckSum = false;
                                        goto case MySqlToken.LiteralBoolTrue;
                                    }

                                    case MySqlToken.LiteralBoolTrue:
                                    {
                                        lexer.NextToken();
                                        options.CheckSum = true;
                                        break;
                                    }

                                    case MySqlToken.LiteralNumPureDigit:
                                    {
                                        var intVal = (int)lexer.GetIntegerValue();
                                        lexer.NextToken();
                                        if (intVal == 0)
                                        {
                                            options.CheckSum = false;
                                        }
                                        else
                                        {
                                            options.CheckSum = true;
                                        }
                                        break;
                                    }

                                    default:
                                    {
                                        throw new SqlSyntaxErrorException("table option of CHECKSUM error");
                                    }
                                }
                                goto os_break;
                            }

                            case SpecialIdentifier.DelayKeyWrite:
                            {
                                // | DELAY_KEY_WRITE [=] {0 | 1}
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                switch (lexer.Token())
                                {
                                    case MySqlToken.LiteralBoolFalse:
                                    {
                                        lexer.NextToken();
                                        options.DelayKeyWrite = false;
                                        goto case MySqlToken.LiteralBoolTrue;
                                    }

                                    case MySqlToken.LiteralBoolTrue:
                                    {
                                        lexer.NextToken();
                                        options.DelayKeyWrite = true;
                                        break;
                                    }

                                    case MySqlToken.LiteralNumPureDigit:
                                    {
                                        var intVal_1 = (int)lexer.GetIntegerValue();
                                        lexer.NextToken();
                                        if (intVal_1 == 0)
                                        {
                                            options.DelayKeyWrite = false;
                                        }
                                        else
                                        {
                                            options.DelayKeyWrite = true;
                                        }
                                        break;
                                    }

                                    default:
                                    {
                                        throw new SqlSyntaxErrorException("table option of DELAY_KEY_WRITE error");
                                    }
                                }
                                goto os_break;
                            }

                            case SpecialIdentifier.Comment:
                            {
                                // | COMMENT [=] 'string'
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                options.Comment = (LiteralString)exprParser.Expression();
                                goto os_break;
                            }

                            case SpecialIdentifier.Connection:
                            {
                                // | CONNECTION [=] 'connect_string'
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                options.Connection = (LiteralString)exprParser.Expression();
                                goto os_break;
                            }

                            case SpecialIdentifier.Data:
                            {
                                // | DATA DIRECTORY [=] 'absolute path to directory'
                                lexer.NextToken();
                                MatchIdentifier("DIRECTORY");
                                if (lexer.Token() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                options.DataDir = (LiteralString)exprParser.Expression();
                                goto os_break;
                            }

                            case SpecialIdentifier.InsertMethod:
                            {
                                // | INSERT_METHOD [=] { NO | FIRST | LAST }
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                switch (MatchIdentifier("NO", "FIRST", "LAST"))
                                {
                                    case 0:
                                    {
                                        options.InsertMethod = InsertMethod.No;
                                        break;
                                    }

                                    case 1:
                                    {
                                        options.InsertMethod = InsertMethod.First;
                                        break;
                                    }

                                    case 2:
                                    {
                                        options.InsertMethod = InsertMethod.Last;
                                        break;
                                    }
                                }
                                goto os_break;
                            }

                            case SpecialIdentifier.KeyBlockSize:
                            {
                                // | KEY_BLOCK_SIZE [=] value
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                options.KeyBlockSize = exprParser.Expression();
                                goto os_break;
                            }

                            case SpecialIdentifier.MaxRows:
                            {
                                // | MAX_ROWS [=] value
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                options.MaxRows = exprParser.Expression();
                                goto os_break;
                            }

                            case SpecialIdentifier.MinRows:
                            {
                                // | MIN_ROWS [=] value
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                options.MinRows = exprParser.Expression();
                                goto os_break;
                            }

                            case SpecialIdentifier.PackKeys:
                            {
                                // | PACK_KEYS [=] {0 | 1 | DEFAULT}
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                switch (lexer.Token())
                                {
                                    case MySqlToken.LiteralBoolFalse:
                                    {
                                        lexer.NextToken();
                                        options.PackKeys = PackKeys.False;
                                        break;
                                    }

                                    case MySqlToken.LiteralBoolTrue:
                                    {
                                        lexer.NextToken();
                                        options.PackKeys = PackKeys.True;
                                        break;
                                    }

                                    case MySqlToken.LiteralNumPureDigit:
                                    {
                                        var intVal_2 = (int)lexer.GetIntegerValue();
                                        lexer.NextToken();
                                        if (intVal_2 == 0)
                                        {
                                            options.PackKeys = PackKeys.False;
                                        }
                                        else
                                        {
                                            options.PackKeys = PackKeys.True;
                                        }
                                        break;
                                    }

                                    case MySqlToken.KwDefault:
                                    {
                                        lexer.NextToken();
                                        options.PackKeys = PackKeys.Default;
                                        break;
                                    }

                                    default:
                                    {
                                        throw new SqlSyntaxErrorException("table option of PACK_KEYS error");
                                    }
                                }
                                goto os_break;
                            }

                            case SpecialIdentifier.Password:
                            {
                                // | PASSWORD [=] 'string'
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                options.Password = (LiteralString)exprParser.Expression();
                                goto os_break;
                            }

                            case SpecialIdentifier.RowFormat:
                            {
                                // | ROW_FORMAT [=]
                                // {DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNDANT|COMPACT}
                                if (lexer.NextToken() == MySqlToken.OpEquals)
                                {
                                    lexer.NextToken();
                                }
                                switch (lexer.Token())
                                {
                                    case MySqlToken.KwDefault:
                                    {
                                        lexer.NextToken();
                                        options.RowFormat = RowFormat.Default;
                                        goto os_break;
                                    }

                                    case MySqlToken.Identifier:
                                    {
                                        var sid = specialIdentifiers.GetValue(lexer.GetStringValueUppercase());
                                        if (sid != SpecialIdentifier.None)
                                        {
                                            switch (sid)
                                            {
                                                case SpecialIdentifier.Dynamic:
                                                {
                                                    lexer.NextToken();
                                                    options.RowFormat = RowFormat.Dynamic;
                                                    goto os_break;
                                                }

                                                case SpecialIdentifier.Fixed:
                                                {
                                                    lexer.NextToken();
                                                    options.RowFormat = RowFormat.Fixed;
                                                    goto os_break;
                                                }

                                                case SpecialIdentifier.Compressed:
                                                {
                                                    lexer.NextToken();
                                                    options.RowFormat = RowFormat.Compressed;
                                                    goto os_break;
                                                }

                                                case SpecialIdentifier.Redundant:
                                                {
                                                    lexer.NextToken();
                                                    options.RowFormat = RowFormat.Redundant;
                                                    goto os_break;
                                                }

                                                case SpecialIdentifier.Compact:
                                                {
                                                    lexer.NextToken();
                                                    options.RowFormat = RowFormat.Compact;
                                                    goto os_break;
                                                }
                                            }
                                        }
                                        goto default;
                                    }

                                    default:
                                    {
                                        throw new SqlSyntaxErrorException("table option of ROW_FORMAT error");
                                    }
                                }
                                //break;
                            }
                        }
                    }
                    goto default;
                }

                default:
                {
                    return false;
                }
            }
            os_break:
            ;
            return true;
        }