Mercurial > sqlpython
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 |