Exemple #1
0
        private bool ReadCreateRelationship()
        {
            var startPos = _parser.Position;
            var ret = false;
            try
            {
                if (!_parser.Read() || _parser.TokenText != "relationship") return false;

                if (!_parser.Read() || _parser.TokenType != TokenType.Word) throw new ProbeException("Expected relationship name after 'create relationship'.");
                var relName = _parser.TokenText;

                if (!_parser.Read() || _parser.TokenType != TokenType.Number) throw new ProbeException("Expected relationship number after name.");
                var relNumber = int.Parse(_parser.TokenText);

                Position pos;
                string relPrompt = "";
                string relComment = "";
                if (_parser.Peek(out pos) && _parser.TokenText == "prompt")
                {
                    _parser.Position = pos;
                    if (!_parser.Read() || _parser.TokenType != TokenType.StringLiteral) throw new ProbeException("Expected string literal after 'prompt'.");
                    relPrompt = Parser.StringLiteralToString(_parser.TokenText);
                }

                if (_parser.Peek(out pos) && _parser.TokenText == "comment")
                {
                    _parser.Position = pos;
                    if (!_parser.Read() || _parser.TokenType != TokenType.StringLiteral) throw new ProbeException("Expected string literal after 'comment'.");
                    relComment = Parser.StringLiteralToString(_parser.TokenText);
                }

                if (!_parser.Read() || (_parser.TokenText != "one" && _parser.TokenText != "many")) throw new ProbeException("Expected 'one' or 'many' after relationship number.");
                if (!_parser.Read() || _parser.TokenType != TokenType.Word) throw new ProbeException("Expected parent table name for relationship.");
                if (!_parser.Read() || _parser.TokenText != "to") throw new ProbeException("Expected 'to' after relationship parent table name.");
                if (!_parser.Read() || (_parser.TokenText != "one" && _parser.TokenText != "many")) throw new ProbeException("Expected 'one' or 'many' after relationship 'to'.");
                if (!_parser.Read() || _parser.TokenType != TokenType.Word) throw new ProbeException("Expected child table name for relationship.");

                if (_parser.Peek(out pos) && _parser.TokenText == "order")
                {
                    _parser.Position = pos;
                    if (!_parser.Read() || _parser.TokenText != "by") throw new ProbeException("Expected 'by' after 'order' in relationship.");
                    if (_parser.Peek(out pos) && _parser.TokenText == "unique")
                    {
                        _parser.Position = pos;
                    }

                    while (true)
                    {
                        if (!_parser.Read()) throw new ProbeException("Unexpected end of file in relationship column list.");
                        if (_parser.TokenText == "(") break;
                        if (_parser.TokenType != TokenType.Word) throw new ProbeException("Expected column name in relationship column list.");
                    }
                }
                else
                {
                    if (!_parser.Read() || _parser.TokenText != "(") throw new ProbeException("Expected '(' after relationship.");
                }

                var table = new ProbeTable(relNumber, relName, relPrompt);
                ReadTableFields(")", new ProbeTable[] { table });
                table.SetFieldsLoaded();
                _tables.Add(table);
                _relInds.Add(new ProbeRelInd { Name = relName });
                return ret = true;
            }
            catch (ProbeException ex)
            {
                ProbeNppPlugin.Instance.Output.WriteLine(OutputStyle.Warning, string.Format("Exception when processing 'create relationship' for table '{0}': {1}", _tableName, ex.ToString()));
                return ret = false;
            }
            finally
            {
                if (!ret) _parser.Position = startPos;
            }
        }