@@ -503,14 +503,28 @@ def Tokens2Unicode(stream):
503503 return result
504504
505505
506- class OutputPythonFilter (Filter ):
507-
506+ class OutputFilter (Filter ):
508507 def __init__ (self , varname = 'sql' ):
509- self .varname = varname
510- self .cnt = 0
508+ self .varname = self . varname_prefix + varname
509+ self .count = 0
511510
512- def _process (self , stream , varname , count , has_nl ):
513- if count > 1 :
511+ def process (self , stack , stmt ):
512+ self .count += 1
513+ if self .count > 1 :
514+ varname = '%s%d' % (self .varname , self .count )
515+ else :
516+ varname = self .varname
517+
518+ has_nl = len (unicode (stmt ).strip ().splitlines ()) > 1
519+ stmt .tokens = self ._process (stmt .tokens , varname , has_nl )
520+ return stmt
521+
522+
523+ class OutputPythonFilter (OutputFilter ):
524+ varname_prefix = ''
525+
526+ def _process (self , stream , varname , has_nl ):
527+ if self .count > 1 :
514528 yield sql .Token (T .Whitespace , '\n ' )
515529 yield sql .Token (T .Name , varname )
516530 yield sql .Token (T .Whitespace , ' ' )
@@ -519,6 +533,7 @@ def _process(self, stream, varname, count, has_nl):
519533 if has_nl :
520534 yield sql .Token (T .Operator , '(' )
521535 yield sql .Token (T .Text , "'" )
536+
522537 cnt = 0
523538 for token in stream :
524539 cnt += 1
@@ -528,74 +543,59 @@ def _process(self, stream, varname, count, has_nl):
528543 after_lb = token .value .split ('\n ' , 1 )[1 ]
529544 yield sql .Token (T .Text , " '" )
530545 yield sql .Token (T .Whitespace , '\n ' )
531- for i in range ( len ( varname ) + 4 ):
532- yield sql .Token (T .Whitespace , ' ' )
546+
547+ yield sql .Token (T .Whitespace , ' ' * ( len ( varname ) + 4 ) )
533548 yield sql .Token (T .Text , "'" )
534549 if after_lb : # it's the indendation
535550 yield sql .Token (T .Whitespace , after_lb )
536551 continue
552+
537553 elif token .value and "'" in token .value :
538554 token .value = token .value .replace ("'" , "\\ '" )
539555 yield sql .Token (T .Text , token .value or '' )
556+
540557 yield sql .Token (T .Text , "'" )
541558 if has_nl :
542559 yield sql .Token (T .Operator , ')' )
543560
544- def process (self , stack , stmt ):
545- self .cnt += 1
546- if self .cnt > 1 :
547- varname = '%s%d' % (self .varname , self .cnt )
548- else :
549- varname = self .varname
550- has_nl = len (unicode (stmt ).strip ().splitlines ()) > 1
551- stmt .tokens = self ._process (stmt .tokens , varname , self .cnt , has_nl )
552- return stmt
553-
554-
555- class OutputPHPFilter (Filter ):
556561
557- def __init__ (self , varname = 'sql' ):
558- self .varname = '$%s' % varname
559- self .count = 0
562+ class OutputPHPFilter (OutputFilter ):
563+ varname_prefix = '$'
560564
561- def _process (self , stream , varname ):
565+ def _process (self , stream , varname , has_nl ):
562566 if self .count > 1 :
563567 yield sql .Token (T .Whitespace , '\n ' )
564568 yield sql .Token (T .Name , varname )
565569 yield sql .Token (T .Whitespace , ' ' )
570+ if has_nl :
571+ yield sql .Token (T .Whitespace , ' ' )
566572 yield sql .Token (T .Operator , '=' )
567573 yield sql .Token (T .Whitespace , ' ' )
568574 yield sql .Token (T .Text , '"' )
575+
569576 for token in stream :
570577 if token .is_whitespace () and '\n ' in token .value :
571578 after_lb = token .value .split ('\n ' , 1 )[1 ]
572579 yield sql .Token (T .Text , ' "' )
573580 yield sql .Token (T .Operator , ';' )
574581 yield sql .Token (T .Whitespace , '\n ' )
582+
575583 yield sql .Token (T .Name , varname )
576584 yield sql .Token (T .Whitespace , ' ' )
577- yield sql .Token (T .Punctuation , '.' )
578- yield sql .Token (T .Operator , '=' )
585+ yield sql .Token (T .Operator , '.=' )
579586 yield sql .Token (T .Whitespace , ' ' )
580587 yield sql .Token (T .Text , '"' )
581588 if after_lb :
582589 yield sql .Token (T .Text , after_lb )
583590 continue
591+
584592 elif '"' in token .value :
585593 token .value = token .value .replace ('"' , '\\ "' )
586594 yield sql .Token (T .Text , token .value )
595+
587596 yield sql .Token (T .Text , '"' )
588597 yield sql .Token (T .Punctuation , ';' )
589598
590- def process (self , stack , stmt ):
591- self .count += 1
592- if self .count > 1 :
593- varname = '%s%d' % (self .varname , self .count )
594- else :
595- varname = self .varname
596- stmt .tokens = tuple (self ._process (stmt .tokens , varname ))
597- return stmt
598-
599599
600600class Limit (Filter ):
601601 """Get the LIMIT of a query.
0 commit comments