]> git.phdru.name Git - sqlconvert.git/blobdiff - scripts/mysql2sql
Add release script
[sqlconvert.git] / scripts / mysql2sql
index d3178e9936219dc0b4d1acb7faf0c3ce27adfcb1..e63c1fd8f5942f0735256d5aae12e51e3ebd318a 100755 (executable)
@@ -8,7 +8,8 @@ import sys
 
 from sqlparse.compat import text_type
 from sqlconvert.print_tokens import print_tokens
-from sqlconvert.process_tokens import requote_names, StatementGrouper
+from sqlconvert.process_mysql import is_directive_statement, process_statement
+from sqlconvert.process_tokens import is_newline_statement, StatementGrouper
 
 from m_lib.defenc import default_encoding
 from m_lib.pbar.tty_pbar import ttyProgressBar
@@ -24,20 +25,25 @@ def get_fsize(fp):
     return size
 
 
-def main(infile, encoding, outfile, output_encoding, use_pbar):
+def main(infile, encoding, outfile, output_encoding, use_pbar, quoting_style):
     if use_pbar:
         size = get_fsize(infile)
         if size is None:
             use_pbar = False
 
-    print("Converting: ", end='', file=sys.stderr)
-    sys.stderr.flush()
+    if use_pbar:
+        print("Converting", end='', file=sys.stderr)
+        if infile.name != '<stdin>':
+            print(' ' + infile.name, end='', file=sys.stderr)
+        print(": ", end='', file=sys.stderr)
+        sys.stderr.flush()
 
     if use_pbar:
         pbar = ttyProgressBar(0, size-1)
         cur_pos = 0
 
     grouper = StatementGrouper(encoding=encoding)
+    got_directive = False
     for line in infile:
         if use_pbar:
             if isinstance(line, text_type):
@@ -46,9 +52,15 @@ def main(infile, encoding, outfile, output_encoding, use_pbar):
                 cur_pos += len(line)
             pbar.display(cur_pos)
         grouper.process_line(line)
-        if grouper.statements:
-            for statement in grouper.get_statements():
-                requote_names(statement)
+        for statement in grouper.get_statements():
+            if got_directive and is_newline_statement(statement):
+                # Condense a sequence of newlines after a /*! directive */;
+                got_directive = False
+                continue
+            got_directive = is_directive_statement(statement)
+            if got_directive:
+                continue
+            for statement in process_statement(statement, quoting_style):
                 print_tokens(statement, outfile=outfile,
                              encoding=output_encoding)
     tokens = grouper.close()
@@ -58,7 +70,7 @@ def main(infile, encoding, outfile, output_encoding, use_pbar):
 
     if use_pbar:
         pbar.erase()
-    print("done.")
+        print("done.")
 
 if __name__ == '__main__':
     parser = argparse.ArgumentParser(description='Convert MySQL to SQL')
@@ -68,6 +80,13 @@ if __name__ == '__main__':
                         help='separate output encoding, default is the same '
                         'as -e except for console; for console output '
                         'charset from the current locale is used')
+    parser.add_argument('-m', '--mysql', action='store_true',
+                        help='MySQL/MariaDB quoting style')
+    parser.add_argument('-p', '--pg', '--postgres', action='store_true',
+                        help='PostgreSQL quoting style')
+    parser.add_argument('-s', '--sqlite', action='store_true',
+                        help='Generic SQL/SQLite quoting style; '
+                        'this is the default')
     parser.add_argument('-o', '--outfile', help='output file name')
     parser.add_argument('-P', '--no-pbar', action='store_true',
                         help='inhibit progress bar')
@@ -75,6 +94,13 @@ if __name__ == '__main__':
     parser.add_argument('output_file', nargs='?', help='output file name')
     args = parser.parse_args()
 
+    if int(args.mysql) + int(args.pg) + int(args.sqlite) > 1:
+        print("Error: options -m/-p/-s are mutually incompatible, "
+              "use only one of them",
+              file=sys.stderr)
+        parser.print_help()
+        sys.exit(1)
+
     if args.infile:
         if args.infile == '-':
             infile = sys.stdin
@@ -111,6 +137,7 @@ if __name__ == '__main__':
 
     if outfile == '-':
         outfile = sys.stdout
+        args.no_pbar = True
     else:
         try:
             outfile = open(outfile, 'wt', encoding=output_encoding)
@@ -119,4 +146,12 @@ if __name__ == '__main__':
                 infile.close()
             raise
 
-    main(infile, args.encoding, outfile, output_encoding, not args.no_pbar)
+    if args.mysql:
+        quoting_style = 'mysql'
+    elif args.pg:
+        quoting_style = 'postgres'
+    else:
+        quoting_style = 'sqlite'
+
+    main(infile, args.encoding, outfile, output_encoding, not args.no_pbar,
+         quoting_style)