X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=mysql2sql%2Fprocess_tokens.py;h=ddab2bf649eac2e69e67eef48e7b1edbf07b0dea;hb=0f209248832190291a510febd790e71a815e496a;hp=37752e7c146a8d76ad63f9b7ccbbe395066eec4e;hpb=96d6304e4c08ef94bb7dfac3e3069fcb8c982747;p=sqlconvert.git diff --git a/mysql2sql/process_tokens.py b/mysql2sql/process_tokens.py index 37752e7..ddab2bf 100644 --- a/mysql2sql/process_tokens.py +++ b/mysql2sql/process_tokens.py @@ -1,6 +1,5 @@ from sqlparse import parse -from sqlparse.sql import Statement from sqlparse.tokens import Name, Error, Punctuation, Comment, Newline, \ Whitespace @@ -27,33 +26,43 @@ def find_error(token_list): class StatementGrouper(object): + """Collect lines and reparse until the last statement is complete""" + def __init__(self): - self.statements = [] - self.tokens = [] self.lines = [] + self.statements = [] def process_line(self, line): - lines = self.lines - lines.append(line) - tokens = parse('\n'.join(lines))[0] - self.process_tokens(tokens) - self.lines = [] + self.lines.append(line) + self.process_lines() - def process_tokens(self, tokens): - for token in tokens: - self.tokens.append(token) - if (token.ttype == Punctuation) and (token.value == ';'): - self.statements.append(Statement(self.tokens)) - self.tokens = [] + def process_lines(self): + statements = parse('\n'.join(self.lines)) + last_stmt = statements[-1] + for i in xrange(len(last_stmt.tokens) - 1, 0, -1): + token = last_stmt.tokens[i] + if token.ttype in (Comment.Single, Comment.Multiline, + Newline, Whitespace): + continue + if token.ttype is Punctuation and token.value == ';': + break # The last statement is complete + # The last statement is still incomplete - wait for the next line + return + self.lines = [] + self.statements = statements def get_statements(self): - for statement in self.statements: - yield statement + for stmt in self.statements: + yield stmt self.statements = [] def close(self): - for token in self.tokens: + if not self.lines: + return + tokens = parse('\n'.join(self.lines)) + for token in tokens: if (token.ttype not in (Comment.Single, Comment.Multiline, Newline, Whitespace)): - raise ValueError("Incomplete SQL statement: %s" % self.tokens) - return self.tokens + raise ValueError("Incomplete SQL statement: %s" % + tokens) + return tokens