comparison sqlpyPlus.py @ 10:2ef0e2608123

reworking pull
author devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
date Tue, 18 Dec 2007 17:00:45 -0500
parents 8e909570e7de
children cab368ea3ec8
comparison
equal deleted inserted replaced
9:f70cc3be6377 10:2ef0e2608123
23 :b = 3 23 :b = 3
24 24
25 - catherinedevlin.blogspot.com May 31, 2006 25 - catherinedevlin.blogspot.com May 31, 2006
26 """ 26 """
27 # note in cmd.cmd about supporting emacs commands? 27 # note in cmd.cmd about supporting emacs commands?
28
29 pullQueries = {
30 'PROCEDURE':("""
31 text
32 FROM all_source
33 WHERE owner = :owner
34 AND name = :object_name
35 """,),
36 'PACKAGE':("""
37 text
38 FROM all_source
39 WHERE owner = :owner
40 AND name = :object_name
41 AND type = 'PACKAGE_BODY'
42 """,),
43 'TYPE':("""
44 text
45 FROM all_source
46 WHERE owner = :owner
47 AND name = :object_name
48 AND type = 'TYPE'
49 """,
50 """
51 text
52 FROM all_source
53 WHERE owner = :owner
54 AND name = :object_name
55 AND type = 'TYPE_BODY'
56 """,)
57 }
58 pullQueries['TRIGGER'] = pullQueries['PROCEDURE']
59 pullQueries['FUNCTION'] = pullQueries['PROCEDURE']
60 28
61 descQueries = { 29 descQueries = {
62 'TABLE': (""" 30 'TABLE': ("""
63 atc.column_name, 31 atc.column_name,
64 CASE atc.nullable WHEN 'Y' THEN 'NULL' ELSE 'NOT NULL' END "Null?", 32 CASE atc.nullable WHEN 'Y' THEN 'NULL' ELSE 'NOT NULL' END "Null?",
186 FROM all_tab_columns atc 154 FROM all_tab_columns atc
187 JOIN all_col_comments acc ON (atc.owner = acc.owner and atc.table_name = acc.table_name and atc.column_name = acc.column_name) 155 JOIN all_col_comments acc ON (atc.owner = acc.owner and atc.table_name = acc.table_name and atc.column_name = acc.column_name)
188 WHERE atc.table_name = :object_name 156 WHERE atc.table_name = :object_name
189 AND atc.owner = :owner 157 AND atc.owner = :owner
190 ORDER BY atc.column_id;""", 158 ORDER BY atc.column_id;""",
159 #thanks to Senora.pm for "refs"
160 'refs': """
161 NULL referenced_by,
162 c2.table_name references,
163 c1.constraint_name constraint
164 FROM
165 user_constraints c1,
166 user_constraints c2
167 WHERE
168 c1.table_name = :object_name
169 and c1.constraint_type ='R'
170 and c1.r_constraint_name = c2.constraint_name
171 and c1.r_owner = c2.owner
172 and c1.owner = :owner
173 UNION
174 SELECT c1.table_name referenced_by,
175 NULL references,
176 c1.constraint_name constraint
177 FROM
178 user_constraints c1,
179 user_constraints c2
180 WHERE
181 c2.table_name = :object_name
182 and c1.constraint_type ='R'
183 and c1.r_constraint_name = c2.constraint_name
184 and c1.r_owner = c2.owner
185 and c1.owner = :owner
186 """
191 } 187 }
192 188
193 import sys, os, re, sqlpython, cx_Oracle, pyparsing 189 import sys, os, re, sqlpython, cx_Oracle, pyparsing
194 190
195 if float(sys.version[:3]) < 2.3: 191 if float(sys.version[:3]) < 2.3:
367 try: 363 try:
368 getme = int(getme) 364 getme = int(getme)
369 if getme < 0: 365 if getme < 0:
370 return self[:(-1 * getme)] 366 return self[:(-1 * getme)]
371 else: 367 else:
372 return self[getme-1] 368 return [self[getme-1]]
373 except IndexError: 369 except IndexError:
374 return [] 370 return []
375 except (ValueError, TypeError): 371 except (ValueError, TypeError):
376 getme = getme.strip() 372 getme = getme.strip()
377 mtch = self.rangeFrom.search(getme) 373 mtch = self.rangeFrom.search(getme)
397 self.spoolFile = None 393 self.spoolFile = None
398 self.autobind = False 394 self.autobind = False
399 self.failover = False 395 self.failover = False
400 self.multiline = '''select insert update delete tselect 396 self.multiline = '''select insert update delete tselect
401 create drop alter'''.split() 397 create drop alter'''.split()
402 self.excludeFromHistory = '''run r list l history hi ed'''.split() 398 self.excludeFromHistory = '''run r list l history hi ed li'''.split()
403 399
404 def default(self, arg, do_everywhere=False): 400 def default(self, arg, do_everywhere=False):
405 sqlpython.sqlpython.default(self, arg, do_everywhere) 401 sqlpython.sqlpython.default(self, arg, do_everywhere)
406 self.sqlBuffer.append(self.query) 402 self.sqlBuffer.append(self.query)
407 403
462 except Exception: 458 except Exception:
463 return line 459 return line
464 460
465 def postcmd(self, stop, line): 461 def postcmd(self, stop, line):
466 """Hook method executed just after a command dispatch is finished.""" 462 """Hook method executed just after a command dispatch is finished."""
467 command = line.split(None,1)[0].lower() 463 try:
468 if command not in self.excludeFromHistory: 464 command = line.split(None,1)[0].lower()
469 self.history.append(line) 465 if command not in self.excludeFromHistory:
470 return stop 466 self.history.append(line)
467 finally:
468 return stop
471 469
472 def onecmd_plus_hooks(self, line): 470 def onecmd_plus_hooks(self, line):
473 line = self.precmd(line) 471 line = self.precmd(line)
474 stop = self.onecmd(line) 472 stop = self.onecmd(line)
475 stop = self.postcmd(stop, line) 473 stop = self.postcmd(stop, line)
667 def do_pull(self, arg): 665 def do_pull(self, arg):
668 "Displays source code." 666 "Displays source code."
669 667
670 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) 668 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper())
671 print "%s %s.%s" % (object_type, owner, object_name) 669 print "%s %s.%s" % (object_type, owner, object_name)
672 pullQ = pullQueries.get(object_type) 670 print self.curs.callfunc('DBMS_METADATA.GET_DDL', cx_Oracle.CLOB,
673 if pullQ: 671 [object_type, object_name, owner])
674 for q in pullQ: 672
675 self.do_select(q,bindVarsIn={'object_name':object_name, 'owner':owner})
676
677 def do_describe(self, arg): 673 def do_describe(self, arg):
678 "emulates SQL*Plus's DESCRIBE" 674 "emulates SQL*Plus's DESCRIBE"
679 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) 675 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper())
680 print "%s %s.%s" % (object_type, owner, object_name) 676 print "%s %s.%s" % (object_type, owner, object_name)
681 descQ = descQueries.get(object_type) 677 descQ = descQueries.get(object_type)
682 if descQ: 678 if descQ:
683 for q in descQ: 679 for q in descQ:
684 self.do_select(q,bindVarsIn={'object_name':object_name, 'owner':owner}) 680 self.do_select(q,bindVarsIn={'object_name':object_name, 'owner':owner})
685 elif object_type == 'PACKAGE': 681 elif object_type == 'PACKAGE':
686 self.curs.execute(descQueries['PackageObjects'], {'package_name':object_name, 'owner':owner}) 682 self.curs.execute(descQueries['PackageObjects'][0], {'package_name':object_name, 'owner':owner})
687 for (packageObj_name,) in self.curs: 683 packageContents = self.curs.fetchall()
684 for (packageObj_name,) in packageContents:
688 print packageObj_name 685 print packageObj_name
689 self.do_select(descQueries['PackageObjArgs'],bindVarsIn={'package_name':object_name, 'owner':owner, 'object_name':packageObj_name}) 686 self.do_select(descQueries['PackageObjArgs'][0],bindVarsIn={'package_name':object_name, 'owner':owner, 'object_name':packageObj_name})
690 do_desc = do_describe 687 do_desc = do_describe
691 688
692 def do_comments(self, arg): 689 def do_comments(self, arg):
693 'Prints comments on a table and its columns.' 690 'Prints comments on a table and its columns.'
694 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) 691 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper())
947 def do_grep(self, arg): 944 def do_grep(self, arg):
948 """grep PATTERN TABLE - search for term in any of TABLE's fields""" 945 """grep PATTERN TABLE - search for term in any of TABLE's fields"""
949 targets = arg.split() 946 targets = arg.split()
950 pattern = targets.pop(0) 947 pattern = targets.pop(0)
951 for target in targets: 948 for target in targets:
949 target = target.rstrip(';')
952 sql = [] 950 sql = []
953 print 'select * from %s where 1=0' % target
954 try: 951 try:
955 self.curs.execute('select * from %s where 1=0' % target) 952 self.curs.execute('select * from %s where 1=0' % target)
956 sql = ' or '.join("%s LIKE '%%%s%%'" % (d[0], pattern) for d in self.curs.description) 953 sql = ' or '.join("%s LIKE '%%%s%%'" % (d[0], pattern) for d in self.curs.description)
957 sql = '* FROM %s WHERE %s' % (target, sql) 954 sql = '* FROM %s WHERE %s' % (target, sql)
958 self.do_select(sql) 955 self.do_select(sql)
959 except Exception, e: 956 except Exception, e:
960 print e 957 print e
961 import traceback 958 import traceback
962 traceback.print_exc(file=sys.stdout) 959 traceback.print_exc(file=sys.stdout)
963 960
961 def do_refs(self, arg):
962 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper())
963 if object_type == 'TABLE':
964 self.do_select(queries['refs'],bindVarsIn={'object_name':object_name, 'owner':owner})
965
964 def _test(): 966 def _test():
965 import doctest 967 import doctest
966 doctest.testmod() 968 doctest.testmod()
967 969
968 if __name__ == "__main__": 970 if __name__ == "__main__":