sqltool/sql.py
2020-10-23 11:23:41 -04:00

172 lines
3.6 KiB
Python
Executable file

#!/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 <table> 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 ""