Mercurial > sqlpython
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__": |