X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=scripts%2Fmysql2sql;h=e859f2a533df665041d6320902efb1c3245b0cc2;hb=HEAD;hp=17ee67cd4fb123f08332e1fa37633f896bc66cc1;hpb=86cace63e9bc60457f310bc77aba8fc54b748bbe;p=sqlconvert.git diff --git a/scripts/mysql2sql b/scripts/mysql2sql index 17ee67c..e859f2a 100755 --- a/scripts/mysql2sql +++ b/scripts/mysql2sql @@ -6,14 +6,18 @@ from io import open import os import sys -from sqlparse.compat import text_type from sqlconvert.print_tokens import print_tokens -from sqlconvert.process_mysql import process_statement -from sqlconvert.process_tokens import 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 +try: + text_type = unicode +except NameError: + text_type = str + def get_fsize(fp): try: @@ -25,20 +29,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 != '': + 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): @@ -47,10 +56,16 @@ 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(): - process_statement(statement) - print_tokens(statement, outfile=outfile, + 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() if tokens: @@ -59,7 +74,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') @@ -69,6 +84,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') @@ -76,6 +98,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 @@ -112,6 +141,7 @@ if __name__ == '__main__': if outfile == '-': outfile = sys.stdout + args.no_pbar = True else: try: outfile = open(outfile, 'wt', encoding=output_encoding) @@ -120,4 +150,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)