comparison sqlpyPlus.py @ 40:1fb9f7dee7d8

tearing out cmd2
author devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
date Fri, 18 Jan 2008 15:07:10 -0500
parents 5d29e6a21c6f
children 33c9bc61db66
comparison
equal deleted inserted replaced
39:5d29e6a21c6f 40:1fb9f7dee7d8
43 FROM all_tab_columns atc 43 FROM all_tab_columns atc
44 WHERE atc.table_name = :object_name 44 WHERE atc.table_name = :object_name
45 AND atc.owner = :owner 45 AND atc.owner = :owner
46 ORDER BY atc.column_id;""",), 46 ORDER BY atc.column_id;""",),
47 'PROCEDURE': (""" 47 'PROCEDURE': ("""
48 argument_name, 48 argument_name,
49 data_type, 49 data_type,
50 in_out, 50 in_out,
51 default_value 51 default_value
52 FROM all_arguments 52 FROM all_arguments
53 WHERE object_name = :object_name 53 WHERE object_name = :object_name
54 AND owner = :owner 54 AND owner = :owner
55 AND package_name IS NULL 55 AND package_name IS NULL
56 AND argument_name IS NOT NULL 56 AND argument_name IS NOT NULL
60 FROM all_arguments 60 FROM all_arguments
61 WHERE package_name = :package_name 61 WHERE package_name = :package_name
62 AND owner = :owner""",), 62 AND owner = :owner""",),
63 'PackageObjArgs':(""" 63 'PackageObjArgs':("""
64 object_name, 64 object_name,
65 argument_name, 65 argument_name,
66 data_type, 66 data_type,
67 in_out, 67 in_out,
68 default_value 68 default_value
69 FROM all_arguments 69 FROM all_arguments
70 WHERE package_name = :package_name 70 WHERE package_name = :package_name
71 AND object_name = :object_name 71 AND object_name = :object_name
72 AND owner = :owner 72 AND owner = :owner
73 AND argument_name IS NOT NULL 73 AND argument_name IS NOT NULL
116 descQueries['FUNCTION'] = descQueries['PROCEDURE'] 116 descQueries['FUNCTION'] = descQueries['PROCEDURE']
117 117
118 queries = { 118 queries = {
119 'resolve': """ 119 'resolve': """
120 SELECT object_type, object_name, owner FROM ( 120 SELECT object_type, object_name, owner FROM (
121 SELECT object_type, object_name, user owner, 1 priority 121 SELECT object_type, object_name, user owner, 1 priority
122 FROM user_objects 122 FROM user_objects
123 WHERE object_name = :objName 123 WHERE object_name = :objName
124 UNION ALL 124 UNION ALL
125 SELECT ao.object_type, ao.object_name, ao.owner, 2 priority 125 SELECT ao.object_type, ao.object_name, ao.owner, 2 priority
126 FROM all_objects ao 126 FROM all_objects ao
127 JOIN user_synonyms us ON (us.table_owner = ao.owner AND us.table_name = ao.object_name) 127 JOIN user_synonyms us ON (us.table_owner = ao.owner AND us.table_name = ao.object_name)
128 WHERE us.synonym_name = :objName 128 WHERE us.synonym_name = :objName
129 AND ao.object_type != 'SYNONYM' 129 AND ao.object_type != 'SYNONYM'
130 UNION ALL 130 UNION ALL
131 SELECT ao.object_type, ao.object_name, ao.owner, 3 priority 131 SELECT ao.object_type, ao.object_name, ao.owner, 3 priority
132 FROM all_objects ao 132 FROM all_objects ao
133 JOIN all_synonyms asyn ON (asyn.table_owner = ao.owner AND asyn.table_name = ao.object_name) 133 JOIN all_synonyms asyn ON (asyn.table_owner = ao.owner AND asyn.table_name = ao.object_name)
134 WHERE asyn.synonym_name = :objName 134 WHERE asyn.synonym_name = :objName
135 AND ao.object_type != 'SYNONYM' 135 AND ao.object_type != 'SYNONYM'
136 AND asyn.owner = 'PUBLIC' 136 AND asyn.owner = 'PUBLIC'
137 UNION ALL 137 UNION ALL
138 SELECT 'DIRECTORY' object_type, dir.directory_name, dir.owner, 6 priority 138 SELECT 'DIRECTORY' object_type, dir.directory_name, dir.owner, 6 priority
139 FROM all_directories dir 139 FROM all_directories dir
140 WHERE dir.directory_name = :objName 140 WHERE dir.directory_name = :objName
141 UNION ALL 141 UNION ALL
148 FROM all_tab_comments 148 FROM all_tab_comments
149 WHERE owner = :owner 149 WHERE owner = :owner
150 AND table_name = :table_name""", 150 AND table_name = :table_name""",
151 'colComments': """ 151 'colComments': """
152 atc.column_name, 152 atc.column_name,
153 acc.comments 153 acc.comments
154 FROM all_tab_columns atc 154 FROM all_tab_columns atc
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) 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)
156 WHERE atc.table_name = :object_name 156 WHERE atc.table_name = :object_name
157 AND atc.owner = :owner 157 AND atc.owner = :owner
158 ORDER BY atc.column_id;""", 158 ORDER BY atc.column_id;""",
359 # overrides cmd's parseline 359 # overrides cmd's parseline
360 shortcuts = {'?': 'help', '@': 'getrun', '!': 'shell', ':': 'setbind', '\\': 'psql'} 360 shortcuts = {'?': 'help', '@': 'getrun', '!': 'shell', ':': 'setbind', '\\': 'psql'}
361 def parseline(self, line): 361 def parseline(self, line):
362 """Parse the line into a command name and a string containing 362 """Parse the line into a command name and a string containing
363 the arguments. Returns a tuple containing (command, args, line). 363 the arguments. Returns a tuple containing (command, args, line).
364 'command' and 'args' may be None if the line couldn't be parsed. 364 'command' and 'args' may be None if the line couldn't be parsed.
365 Overrides cmd.cmd.parseline to accept variety of shortcuts..""" 365 Overrides cmd.cmd.parseline to accept variety of shortcuts.."""
366 366
367 cmd, arg. line = sqlpython.parseline(self, line) 367 cmd, arg. line = sqlpython.parseline(self, line)
368 if cmd in ('select', 'sleect', 'insert', 'update', 'delete', 'describe', 368 if cmd in ('select', 'sleect', 'insert', 'update', 'delete', 'describe',
369 'desc', 'comments', 'pull', 'refs', 'desc', 'triggers', 'find') \ 369 'desc', 'comments', 'pull', 'refs', 'desc', 'triggers', 'find') \
370 and not hasattr(self, 'curs'): 370 and not hasattr(self, 'curs'):
371 print 'Not connected.' 371 print 'Not connected.'
372 return '', '', '' 372 return '', '', ''
373 return cmd, arg, line 373 return cmd, arg, line
374 374
375 def precmd(self, line): 375 def precmd(self, line):
506 result = '\n' + sqlpython.pmatrix(transpr,newdesc) 506 result = '\n' + sqlpython.pmatrix(transpr,newdesc)
507 else: 507 else:
508 result = sqlpython.pmatrix(self.rows, self.curs.description, self.maxfetch) 508 result = sqlpython.pmatrix(self.rows, self.curs.description, self.maxfetch)
509 return result 509 return result
510 510
511 def findTerminator(statement):
512 m = self.statementEndPattern.search(statement)
513 if m:
514 return m.groups()
515 else:
516 return statement, None, None
517
511 def do_select(self, arg, bindVarsIn=None, override_terminator=None): 518 def do_select(self, arg, bindVarsIn=None, override_terminator=None):
512 """Fetch rows from a table. 519 """Fetch rows from a table.
513 520
514 Limit the number of rows retrieved by appending 521 Limit the number of rows retrieved by appending
515 an integer after the terminator 522 an integer after the terminator
518 Output may be formatted by choosing an alternative terminator 525 Output may be formatted by choosing an alternative terminator
519 ("help terminators" for details) 526 ("help terminators" for details)
520 """ 527 """
521 bindVarsIn = bindVarsIn or {} 528 bindVarsIn = bindVarsIn or {}
522 self.query = 'select ' + arg 529 self.query = 'select ' + arg
523 (self.query, terminator, rowlimit) = sqlpython.findTerminator(self.query) 530 (self.query, terminator, rowlimit) = self.findTerminator(self.query)
524 if override_terminator: 531 if override_terminator:
525 terminator = override_terminator 532 terminator = override_terminator
526 rowlimit = int(rowlimit or 0) 533 rowlimit = int(rowlimit or 0)
527 try: 534 try:
528 self.varsUsed = findBinds(self.query, self.binds, bindVarsIn) 535 self.varsUsed = findBinds(self.query, self.binds, bindVarsIn)
546 print e 553 print e
547 import traceback 554 import traceback
548 traceback.print_exc(file=sys.stdout) 555 traceback.print_exc(file=sys.stdout)
549 self.sqlBuffer.append(self.query) 556 self.sqlBuffer.append(self.query)
550 557
551 pullflags = flagReader.FlagSet([flagReader.Flag('full')]) 558 pullflags = flagReader.FlagSet([flagReader.Flag('full')])
552 def do_pull(self, arg): 559 def do_pull(self, arg):
553 """Displays source code. 560 """Displays source code.
554 561
555 --full, -f: get dependent objects as well""" 562 --full, -f: get dependent objects as well"""
556 563
557 options, arg = self.pullflags.parse(arg) 564 options, arg = self.pullflags.parse(arg)
558 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) 565 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper())
559 print "%s %s.%s" % (object_type, owner, object_name) 566 print "%s %s.%s" % (object_type, owner, object_name)
560 print self.curs.callfunc('DBMS_METADATA.GET_DDL', cx_Oracle.CLOB, 567 print self.curs.callfunc('DBMS_METADATA.GET_DDL', cx_Oracle.CLOB,
561 [object_type, object_name, owner]) 568 [object_type, object_name, owner])
562 if options.has_key('full'): 569 if options.has_key('full'):
563 for dependent_type in ('OBJECT_GRANT', 'CONSTRAINT', 'TRIGGER'): 570 for dependent_type in ('OBJECT_GRANT', 'CONSTRAINT', 'TRIGGER'):
564 try: 571 try:
565 print self.curs.callfunc('DBMS_METADATA.GET_DEPENDENT_DDL', cx_Oracle.CLOB, 572 print self.curs.callfunc('DBMS_METADATA.GET_DEPENDENT_DDL', cx_Oracle.CLOB,
566 [dependent_type, object_name, owner]) 573 [dependent_type, object_name, owner])
567 except cx_Oracle.DatabaseError: 574 except cx_Oracle.DatabaseError:
568 pass 575 pass
569 576
570 findflags = flagReader.FlagSet([flagReader.Flag('insensitive')]) 577 findflags = flagReader.FlagSet([flagReader.Flag('insensitive')])
571 def do_find(self, arg): 578 def do_find(self, arg):
572 """Finds argument in source code. 579 """Finds argument in source code.
573 580
574 --insensitive, -i: case-insensitive search""" 581 --insensitive, -i: case-insensitive search"""
575 582
576 options, arg = self.findflags.parse(arg) 583 options, arg = self.findflags.parse(arg)
577 if options.has_key('insensitive'): 584 if options.has_key('insensitive'):
578 searchfor = "LOWER(text)" 585 searchfor = "LOWER(text)"
579 arg = arg.lower() 586 arg = arg.lower()
580 else: 587 else:
581 searchfor = "text" 588 searchfor = "text"
582 self.do_select("* from all_source where %s like '%%%s%%'" % (searchfor, arg)) 589 self.do_select("* from all_source where %s like '%%%s%%'" % (searchfor, arg))
583 590
584 def do_describe(self, arg): 591 def do_describe(self, arg):
585 "emulates SQL*Plus's DESCRIBE" 592 "emulates SQL*Plus's DESCRIBE"
586 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) 593 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper())
587 print "%s %s.%s" % (object_type, owner, object_name) 594 print "%s %s.%s" % (object_type, owner, object_name)
588 descQ = descQueries.get(object_type) 595 descQ = descQueries.get(object_type)
589 if descQ: 596 if descQ:
590 for q in descQ: 597 for q in descQ:
591 self.do_select(q,bindVarsIn={'object_name':object_name, 'owner':owner}) 598 self.do_select(q,bindVarsIn={'object_name':object_name, 'owner':owner})
592 elif object_type == 'PACKAGE': 599 elif object_type == 'PACKAGE':
593 self.curs.execute(descQueries['PackageObjects'][0], {'package_name':object_name, 'owner':owner}) 600 self.curs.execute(descQueries['PackageObjects'][0], {'package_name':object_name, 'owner':owner})
594 packageContents = self.curs.fetchall() 601 packageContents = self.curs.fetchall()
595 for (packageObj_name,) in packageContents: 602 for (packageObj_name,) in packageContents:
596 print packageObj_name 603 print packageObj_name
597 self.do_select(descQueries['PackageObjArgs'][0],bindVarsIn={'package_name':object_name, 'owner':owner, 'object_name':packageObj_name}) 604 self.do_select(descQueries['PackageObjArgs'][0],bindVarsIn={'package_name':object_name, 'owner':owner, 'object_name':packageObj_name})
598 do_desc = do_describe 605 do_desc = do_describe
599 606
778 import traceback 785 import traceback
779 traceback.print_exc(file=sys.stdout) 786 traceback.print_exc(file=sys.stdout)
780 787
781 def do_refs(self, arg): 788 def do_refs(self, arg):
782 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) 789 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper())
783 if object_type == 'TABLE': 790 if object_type == 'TABLE':
784 self.do_select(queries['refs'],bindVarsIn={'object_name':object_name, 'owner':owner}) 791 self.do_select(queries['refs'],bindVarsIn={'object_name':object_name, 'owner':owner})
785 792
786 def _test(): 793 def _test():
787 import doctest 794 import doctest
788 doctest.testmod() 795 doctest.testmod()
789 796