2 from __future__ import print_function
9 from sqlconvert.print_tokens import print_tokens
10 from sqlconvert.process_mysql import is_directive_statement, process_statement
11 from sqlconvert.process_tokens import is_newline_statement, StatementGrouper
13 from m_lib.defenc import default_encoding
14 from m_lib.pbar.tty_pbar import ttyProgressBar
24 fp.seek(0, os.SEEK_END)
26 return None # File size is unknown
28 fp.seek(0, os.SEEK_SET)
32 def main(infile, encoding, outfile, output_encoding, use_pbar, quoting_style):
34 size = get_fsize(infile)
39 print("Converting", end='', file=sys.stderr)
40 if infile.name != '<stdin>':
41 print(' ' + infile.name, end='', file=sys.stderr)
42 print(": ", end='', file=sys.stderr)
46 pbar = ttyProgressBar(0, size-1)
49 grouper = StatementGrouper(encoding=encoding)
53 if isinstance(line, text_type):
54 cur_pos += len(line.encode(encoding))
58 grouper.process_line(line)
59 for statement in grouper.get_statements():
60 if got_directive and is_newline_statement(statement):
61 # Condense a sequence of newlines after a /*! directive */;
64 got_directive = is_directive_statement(statement)
67 for _statement in process_statement(statement, quoting_style):
68 print_tokens(_statement, outfile=outfile,
69 encoding=output_encoding)
70 tokens = grouper.close()
73 print_tokens(token, outfile=outfile, encoding=output_encoding)
79 if __name__ == '__main__':
80 parser = argparse.ArgumentParser(description='Convert MySQL to SQL')
81 parser.add_argument('-e', '--encoding', default='utf-8',
82 help='input/output encoding, default is utf-8')
83 parser.add_argument('-E', '--output-encoding',
84 help='separate output encoding, default is the same '
85 'as -e except for console; for console output '
86 'charset from the current locale is used')
87 parser.add_argument('-m', '--mysql', action='store_true',
88 help='MySQL/MariaDB quoting style')
89 parser.add_argument('-p', '--pg', '--postgres', action='store_true',
90 help='PostgreSQL quoting style')
91 parser.add_argument('-s', '--sqlite', action='store_true',
92 help='Generic SQL/SQLite quoting style; '
93 'this is the default')
94 parser.add_argument('-o', '--outfile', help='output file name')
95 parser.add_argument('-P', '--no-pbar', action='store_true',
96 help='inhibit progress bar')
97 parser.add_argument('infile', help='input file name')
98 parser.add_argument('output_file', nargs='?', help='output file name')
99 args = parser.parse_args()
101 if int(args.mysql) + int(args.pg) + int(args.sqlite) > 1:
102 print("Error: options -m/-p/-s are mutually incompatible, "
103 "use only one of them",
109 if args.infile == '-':
112 infile = open(args.infile, 'rt', encoding=args.encoding)
117 print("Error: cannot read from console", file=sys.stderr)
123 print("Error: too many output files", file=sys.stderr)
127 outfile = args.outfile
129 elif args.output_file:
130 outfile = args.output_file
135 if args.output_encoding:
136 output_encoding = args.output_encoding
138 output_encoding = default_encoding
140 output_encoding = args.encoding
147 outfile = open(outfile, 'wt', encoding=output_encoding)
149 if infile is not sys.stdin:
154 quoting_style = 'mysql'
156 quoting_style = 'postgres'
158 quoting_style = 'sqlite'
160 main(infile, args.encoding, outfile, output_encoding, not args.no_pbar,