summaryrefslogtreecommitdiff
path: root/ndb/src/client/odbc/codegen/SimpleParser.cpp
blob: 62162172bc8fcb0f73a702a14bdbe0ae26b6759b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/* Copyright (C) 2003 MySQL AB

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */

#include <NdbMutex.h>
#include <common/StmtArea.hpp>
#include <FlexLexer.h>
#include "SimpleParser.hpp"

SimpleParser::~SimpleParser()
{
}

#ifdef NDB_WIN32
static NdbMutex & parse_mutex = * NdbMutex_Create();
#else
static NdbMutex parse_mutex = NDB_MUTEX_INITIALIZER;
#endif

void
SimpleParser::yyparse()
{
    Ctx& ctx = this->ctx();
    NdbMutex_Lock(&parse_mutex);
    ctx_log2(("parse: %s", stmtArea().sqlText().c_str()));
#if YYDEBUG
    SimpleParser_yydebug = (m_ctx.logLevel() >= 5);
#endif
    SimpleParser_yyparse((void*)this);
    NdbMutex_Unlock(&parse_mutex);
}

void
SimpleParser::pushState(int sc)
{
    yy_push_state(sc);
    m_stacksize++;
}

void
SimpleParser::popState()
{
    ctx_assert(m_stacksize > 0);
    yy_pop_state();
    m_stacksize--;
}

void
SimpleParser::parseError(const char* msg)
{
    ctx().pushStatus(Sqlstate::_42000, Error::Gen, "%s at '%*s' position %u", msg, yyleng, yytext, m_parsePos - yyleng);
}

int
SimpleParser::LexerInput(char* buf, int max_size)
{
    const BaseString& text = stmtArea().sqlText();
    int n = 0;
    const char* const t = text.c_str();
    const unsigned m = text.length();
    while (n < max_size && m_textPos < m) {
	buf[n++] = t[m_textPos++];
	m_parsePos++;		// XXX simple hack
	break;
    }
    return n;
}

// XXX just a catch-all (scanner should match all input)
void
SimpleParser::LexerOutput(const char* buf, int size)
{
    if (! ctx().ok())
	return;
    const char* msg = "unrecognized input";
    ctx().pushStatus(Sqlstate::_42000, Error::Gen, "%s at '%*s' position %u", msg, size, buf, m_parsePos);
}

void
SimpleParser::LexerError(const char* msg)
{
    ctx().pushStatus(Sqlstate::_42000, Error::Gen, "%s at '%*s' position %u", msg, yyleng, yytext, m_parsePos);
}