From 487ee604b999ae566874a3f28c03cf693dccab9a Mon Sep 17 00:00:00 2001 From: cecilkorik Date: Fri, 23 Oct 2020 11:23:41 -0400 Subject: [PATCH] initial import to hg --- sql.py | 172 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100755 sql.py diff --git a/sql.py b/sql.py new file mode 100755 index 0000000..a3e962d --- /dev/null +++ b/sql.py @@ -0,0 +1,172 @@ +#!/usr/bin/env python2.4 +import cx_Oracle +import sys +import os +import traceback +try: + import readline +except ImportError: + pass + +if len(sys.argv) < 2: + connstr = raw_input('Connect string: ') +else: + connstr = sys.argv[1] + +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 + 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 + +db = cx_Oracle.connect(connstr) +cur = db.cursor() +opts = { + 'page': '20', + 'hide_null_tablespace': '1', + 'hide_tablespaces': 'SYSTEM;SYSAUX;SDE;SPATIAL_DATA' +} +do_quit = False +while True: + try: + v = raw_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 + conds = ["tablespace_name != '%s'" % (x,) for x in opts['hide_tablespaces'].split(';')] + if opts['hide_null_tablespace'][0:1] in ('1', 'Y', 'y', 'T', 't'): + conds += ['tablespace_name is not null'] + conds = ' and '.join(conds) + if conds: + conds = ' where ' + conds + cur.execute("select table_name, tablespace_name from all_tables %s" % (conds,)) + print_row() + elif vl[:5] == 'exec ': + cmd = v[5:] + try: + exec cmd + except: + traceback.print_exc() + 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 cx_Oracle.DatabaseError, e: + sys.stdout.write(str(e)) + 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 cx_Oracle.DatabaseError, e: + try: + cur.execute("SELECT 1 FROM DUAL") + except cx_Oracle.DatabaseError: + print "Database connection lost!" + sys.exit(1) + sys.stdout.write(str(e)) + + + +print ""