From 259d6bdad28a4e1922e72767a7c259756d02428f Mon Sep 17 00:00:00 2001 From: cecilkorik Date: Mon, 23 May 2022 13:37:40 -0400 Subject: [PATCH] first working version --- sql.py | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) create mode 100755 sql.py diff --git a/sql.py b/sql.py new file mode 100755 index 0000000..bd01f23 --- /dev/null +++ b/sql.py @@ -0,0 +1,159 @@ +#!/usr/bin/python3 + +import os +import sys +import sqlalchemy + + +def softpad(s, l, padchar = " "): + padding = padchar * l + if len(s) >= l: + return s + padchar + return (s + padding)[:l] +def pad(s, l, padchar = " "): + padding = padchar * l + return (s + padding)[:l] + +rowbuffer = None +def print_row(): + global rowbuffer, cur, db + if not cur or not cur.description: + return False + try: + page = int(opts['page']) + colhdrs = [x[0] for x in cur.description] + allcols = [] + lens = [] + for i in range(len(colhdrs)): + l = min(len(colhdrs[i]), 10) + lens.append(l) + if rowbuffer: + rowbuffer = [repr(x) for x in rowbuffer] + allcols = [rowbuffer] + for i in range(len(rowbuffer)): + l = len(rowbuffer[i]) + if i > len(lens): + print(lens) + print(rowbuffer) + if l > lens[i]: + lens[i] = l + rowbuffer = None + while len(allcols) < page: + cols = cur.fetchone() + if not cols: + break + cols = [repr(x) for x in cols] + allcols.append(cols) + for i in range(len(cols)): + l = len(cols[i]) + if l > lens[i]: + lens[i] = l + if not allcols: + return False + for i in range(len(colhdrs)): + colhdrs[i] = pad(colhdrs[i], lens[i]) + + for i in range(len(allcols)): + cols = allcols[i] + for j in range(len(cols)): + cols[j] = pad(cols[j], lens[j]) + + colhdrrow = ' | '.join(colhdrs) + seprow = '-' * len(colhdrrow) + print(colhdrrow) + print(seprow) + for cols in allcols: + colsrow = ' | '.join(cols) + print(colsrow) + + rowbuffer = cur.fetchone() + if rowbuffer: + print(" ( more ) ") + return True + except: + traceback.print_exc() + return False + + +opts = { + 'page': '20', + 'hide_null_tablespace': '1', + 'hide_tablespaces': 'SYSTEM;SYSAUX;SDE;SPATIAL_DATA' +} + +if len(sys.argv) < 2: + connstr = input('Connect string: ') +else: + connstr = sys.argv[1] + +e = sqlalchemy.create_engine(connstr) +pool = e.connect() +db = pool.connection +cur = db.cursor() +c2 = db.cursor() + +do_quit = False +while True: + try: + v = input('# ') + except EOFError: + do_quit = True + + if do_quit: + break + v = v.strip() + vl = v.lower() + + if vl == 'quit' or vl == 'exit': + break + elif vl == 'commit': + db.commit() + elif vl == 'rollback': + db.rollback() + elif vl == 'tables': + rowbuffer = None + cur.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES") + print_row() + elif vl[:5] == 'cols ': + rowbuffer = None + vs = v.split(' ') + c2 = db.cursor() + try: + c2.execute("select * from %s where 1 is null" % (vs[1],)) + for coldata in c2.description: + print("%s%s" % (softpad(coldata[0], 40), coldata[1])) + except: + sys.stdout.write(str(sys.exc_info)) + elif vl[:4] == 'set ': + vs = v[4:] + vi = vs.find('=') + vn = vs[:vi] + vv = vs[vi+1:] + opts[vn] = vv + elif vl == '': + print_row() + elif vl == 'help': + print(""" +commands: + tables lists tables + cols lists columns of table + commit commits any pending updates or inserts + rollback aborts and pending updates or inserts + help displays this help + quit exits sql.py +""") + else: + rowbuffer = None + try: + v = v.rstrip(';') + cur.execute(v) + print_row() + except: + try: + c2 = db.cursor() + c2.execute("SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE 1 IS NULL") + except: + print("Database connection lost!") + sys.exit(1) + sys.stdout.write(str(sys.exc_info)) +