]> git.phdru.name Git - sqlconvert.git/commitdiff
Display progress bar
authorOleg Broytman <phd@phdru.name>
Sat, 3 Sep 2016 20:40:29 +0000 (23:40 +0300)
committerOleg Broytman <phd@phdru.name>
Sat, 3 Sep 2016 21:20:08 +0000 (00:20 +0300)
TODO
docs/index.rst
scripts/mysql2sql

diff --git a/TODO b/TODO
index a1c0d9f543584b656d6a72a2024e23595e91c0d5..e719c699a92f27738122daff5c76dcc927de87b4 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,3 @@
-Progress bar.
-
-
 Remove /*! directives */
 
 
index 8b73c1a1e1061394776a39d01c7859b81d506be7..242918a82b9662afe66a49842caaa5a6d2d06e45 100644 (file)
@@ -29,15 +29,19 @@ Usage::
 
 Options::
 
-   -e ENCODING, --encoding ENCODING
+    -e ENCODING, --encoding ENCODING
                            input/output encoding, default is utf-8
-   -E OUTPUT_ENCODING, --output-encoding OUTPUT_ENCODING
+    -E OUTPUT_ENCODING, --output-encoding OUTPUT_ENCODING
                            separate output encoding, default is the same as
                            `-e` except for console; for console output charset
                            from the current locale is used
+    -P, --no-pbar          Inhibit progress bar
     infile                 Input file, stdin if absent or '-'
     -o, --outfile outfile  Output file, stdout if absent or '-'
 
+If stderr is connected to the console the program displays a text mode progress
+bar. Option `-P/--no-pbar` inhibits it.
+
 Option `-o` is useful when infile is absent (input is redirected), for
 example::
 
index 23197ffce6b2cbe7b312d7ab7b0f60d02ba7a7c2..3809c1b29ea99675afb817ca98c97aa11e339dc8 100755 (executable)
@@ -3,17 +3,48 @@ from __future__ import print_function
 
 import argparse
 from io import open
+import os
 import sys
 
+from sqlparse.compat import text_type
 from mysql2sql.print_tokens import print_tokens
 from mysql2sql.process_tokens import requote_names, StatementGrouper
 
 from m_lib.defenc import default_encoding
+from m_lib.pbar.tty_pbar import ttyProgressBar
 
 
-def main(infile, encoding, outfile, output_encoding):
+def get_fsize(fp):
+    try:
+        fp.seek(0, os.SEEK_END)
+    except IOError:
+        return None  # File size is unknown
+    size = fp.tell()
+    fp.seek(0, os.SEEK_SET)
+    return size
+
+
+def main(infile, encoding, outfile, output_encoding, use_pbar):
+    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:
+        pbar = ttyProgressBar(0, size-1)
+        cur_pos = 0
+
     grouper = StatementGrouper(encoding=encoding)
     for line in infile:
+        if use_pbar:
+            if isinstance(line, text_type):
+                cur_pos += len(line.encode(encoding))
+            else:
+                cur_pos += len(line)
+            pbar.display(cur_pos)
         grouper.process_line(line)
         if grouper.statements:
             for statement in grouper.get_statements():
@@ -25,6 +56,9 @@ def main(infile, encoding, outfile, output_encoding):
         for token in tokens:
             print_tokens(token, outfile=outfile, encoding=output_encoding)
 
+    if use_pbar:
+        pbar.erase()
+    print("done.")
 
 if __name__ == '__main__':
     parser = argparse.ArgumentParser(description='Convert MySQL to SQL')
@@ -35,6 +69,8 @@ if __name__ == '__main__':
                         'as -e except for console; for console output '
                         'charset from the current locale is used')
     parser.add_argument('-o', '--outfile', help='output file name')
+    parser.add_argument('-P', '--no-pbar', action='store_true',
+                        help='inhibit progress bar')
     parser.add_argument('infile', help='input file name')
     parser.add_argument('output_file', nargs='?', help='output file name')
     args = parser.parse_args()
@@ -83,4 +119,4 @@ if __name__ == '__main__':
                 infile.close()
             raise
 
-    main(infile, args.encoding, outfile, output_encoding)
+    main(infile, args.encoding, outfile, output_encoding, not args.no_pbar)