X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=mysql2sql%2Fprocess_tokens.py;h=ddab2bf649eac2e69e67eef48e7b1edbf07b0dea;hb=0f209248832190291a510febd790e71a815e496a;hp=7f30a5589b7fad13265b4a9e147fe6308afba545;hpb=3151032d036f9a66bad633dc1018395a14f46bac;p=sqlconvert.git diff --git a/mysql2sql/process_tokens.py b/mysql2sql/process_tokens.py index 7f30a55..ddab2bf 100644 --- a/mysql2sql/process_tokens.py +++ b/mysql2sql/process_tokens.py @@ -1,5 +1,5 @@ -from sqlparse.sql import Statement +from sqlparse import parse from sqlparse.tokens import Name, Error, Punctuation, Comment, Newline, \ Whitespace @@ -26,25 +26,43 @@ def find_error(token_list): class StatementGrouper(object): + """Collect lines and reparse until the last statement is complete""" + def __init__(self): - self.tokens = [] + self.lines = [] self.statements = [] + def process_line(self, line): + self.lines.append(line) + self.process_lines() + + 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 process(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 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