diff lemuriformes/table_size.py @ 17:4793f99b73e0

[lemuriformes] utility functions
author Jeff Hammel <k0scist@gmail.com>
date Sun, 10 Dec 2017 17:42:52 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lemuriformes/table_size.py	Sun Dec 10 17:42:52 2017 -0800
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+"""
+monitor SQL table size
+"""
+
+import argparse
+import csv
+import os
+import sys
+import time
+from .cli import ConfigurationParser
+from .url2sql import url2sql
+
+
+def main(args=sys.argv[1:]):
+    """CLI"""
+
+    # parse command line
+    parser = ConfigurationParser(description=__doc__)
+    parser.add_argument('database', type=url2sql,
+                        help="URL of SQL database to connect to")
+    parser.add_argument('table',
+                        help="table to read sizes of")
+    parser.add_argument('-o', '--output', dest='output',
+                        type=argparse.FileType('a'), default=sys.stdout,
+                        help="CSV output file; stdout by default")
+    parser.add_argument('-w', '--wait', dest='wait',
+                        type=float, default=60.,
+                        help="how long to wait between calls in seconds [DEFAULT: %(default)s]")
+    options = parser.parse_args(args)
+
+    # ensure table is part of database
+    db = options.database
+    tables = db.tables()
+    if options.table not in tables:
+        parser.error("Table '{}' not in database tables: {}".format(options.table,
+                                                                    ', '.join(tables)))
+
+    # instantiate writer
+    writer = csv.writer(options.output)
+
+    # get initial data
+    previous = db.count(options.table)
+    end = time.time()
+    time.sleep(options.wait)
+
+    while True:
+        try:
+            start = time.time()
+            count = db.count(options.table)
+            rate = (count - previous)/(start-end)
+            writer.writerow([start, count, rate])
+            options.output.flush()
+            end = start
+            previous = count
+            time.sleep(options.wait - (time.time() - start))
+        except KeyboardInterrupt:
+            break
+
+if __name__ == '__main__':
+    main()