Mercurial > sqlpython
comparison sqlpyPlus.py @ 5:65ae6cec71c6
expanded desc good so far
author | devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil |
---|---|
date | Tue, 04 Dec 2007 17:19:18 -0500 |
parents | 23c3a58d7804 |
children | f9ec5c20beb4 |
comparison
equal
deleted
inserted
replaced
4:23c3a58d7804 | 5:65ae6cec71c6 |
---|---|
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 | 28 |
29 pullQueries = { | |
30 'PROCEDURE':(""" | |
31 text | |
32 FROM all_source | |
33 WHERE owner = :owner | |
34 AND name = :object_name | |
35 """,) | |
36 } | |
37 pullQueries['TRIGGER'] = pullQueries['PROCEDURE'] | |
38 pullQueries['FUNCTION'] = pullQueries['PROCEDURE'] | |
39 | |
29 descQueries = { | 40 descQueries = { |
30 'TABLE': """ | 41 'TABLE': (""" |
31 atc.column_name, | 42 atc.column_name, |
32 CASE atc.nullable WHEN 'Y' THEN 'NULL' ELSE 'NOT NULL' END "Null?", | 43 CASE atc.nullable WHEN 'Y' THEN 'NULL' ELSE 'NOT NULL' END "Null?", |
33 atc.data_type || | 44 atc.data_type || |
34 CASE atc.data_type WHEN 'DATE' THEN '' | 45 CASE atc.data_type WHEN 'DATE' THEN '' |
35 ELSE '(' || | 46 ELSE '(' || |
41 CASE atc.data_type WHEN 'DATE' THEN '' ELSE ')' END | 52 CASE atc.data_type WHEN 'DATE' THEN '' ELSE ')' END |
42 data_type | 53 data_type |
43 FROM all_tab_columns atc | 54 FROM all_tab_columns atc |
44 WHERE atc.table_name = :object_name | 55 WHERE atc.table_name = :object_name |
45 AND atc.owner = :owner | 56 AND atc.owner = :owner |
46 ORDER BY atc.column_id;""", | 57 ORDER BY atc.column_id;""",), |
47 'PROCEDURE':""" | 58 'PROCEDURE': (""" |
48 argument_name, | 59 argument_name, |
49 data_type, | 60 data_type, |
50 in_out, | 61 in_out, |
51 default_value | 62 default_value |
52 FROM all_arguments | 63 FROM all_arguments |
53 WHERE object_name = :object_name | 64 WHERE object_name = :object_name |
54 AND owner = :owner | 65 AND owner = :owner |
55 AND package_name IS NULL | 66 AND package_name IS NULL |
56 AND argument_name IS NOT NULL | 67 AND argument_name IS NOT NULL |
57 ORDER BY sequence;""", | 68 ORDER BY sequence;""",), |
58 'PackageObjects':""" | 69 'PackageObjects':(""" |
59 SELECT DISTINCT object_name | 70 SELECT DISTINCT object_name |
60 FROM all_arguments | 71 FROM all_arguments |
61 WHERE package_name = :package_name | 72 WHERE package_name = :package_name |
62 AND owner = :owner""", | 73 AND owner = :owner""",), |
63 'PackageObjArgs':""" | 74 'PackageObjArgs':(""" |
64 object_name, | 75 object_name, |
65 argument_name, | 76 argument_name, |
66 data_type, | 77 data_type, |
67 in_out, | 78 in_out, |
68 default_value | 79 default_value |
69 FROM all_arguments | 80 FROM all_arguments |
70 WHERE package_name = :package_name | 81 WHERE package_name = :package_name |
71 AND object_name = :object_name | 82 AND object_name = :object_name |
72 AND owner = :owner | 83 AND owner = :owner |
73 AND argument_name IS NOT NULL | 84 AND argument_name IS NOT NULL |
74 ORDER BY sequence""", | 85 ORDER BY sequence""",), |
75 'TRIGGER':""" | 86 'TRIGGER':(""" |
76 trigger_name, | 87 description |
77 trigger_type, | 88 FROM all_triggers |
78 triggering_event, | 89 WHERE owner = :owner |
90 AND trigger_name = :object_name | |
91 """, | |
92 """ | |
79 table_owner, | 93 table_owner, |
80 base_object_type, | 94 base_object_type, |
81 table_name, | 95 table_name, |
82 column_name, | 96 column_name, |
83 when_clause, | 97 when_clause, |
84 status, | 98 status, |
85 description, | |
86 action_type, | 99 action_type, |
87 crossedition | 100 crossedition |
88 FROM all_triggers | 101 FROM all_triggers |
89 WHERE owner = :owner | 102 WHERE owner = :owner |
90 AND trigger_name = :object_name | 103 AND trigger_name = :object_name |
91 \\t | 104 \\t |
92 """ | 105 """, |
106 ), | |
107 'INDEX':(""" | |
108 index_type, | |
109 table_owner, | |
110 table_name, | |
111 table_type, | |
112 uniqueness, | |
113 compression, | |
114 partitioned, | |
115 temporary, | |
116 generated, | |
117 secondary, | |
118 dropped, | |
119 visibility | |
120 FROM all_indexes | |
121 WHERE owner = :owner | |
122 AND index_name = :object_name | |
123 \\t | |
124 """,) | |
93 } | 125 } |
94 descQueries['VIEW'] = descQueries['TABLE'] | 126 descQueries['VIEW'] = descQueries['TABLE'] |
95 descQueries['FUNCTION'] = descQueries['PROCEDURE'] | 127 descQueries['FUNCTION'] = descQueries['PROCEDURE'] |
96 | 128 |
97 queries = { | 129 queries = { |
482 result.append(','.join('"%s"' % ('' if itm is None else itm) for itm in row)) | 514 result.append(','.join('"%s"' % ('' if itm is None else itm) for itm in row)) |
483 result = '\n'.join(result) | 515 result = '\n'.join(result) |
484 elif outformat == '\\h': | 516 elif outformat == '\\h': |
485 result = self.output_as_html_table() | 517 result = self.output_as_html_table() |
486 elif outformat == '\\t': | 518 elif outformat == '\\t': |
487 | 519 rows = [self.colnames] |
520 rows.extend(list(self.rows)) | |
521 transpr = [[rows[y][x] for y in range(len(rows))]for x in range(len(rows[0]))] # matrix transpose | |
522 newdesc = [['ROW N.'+str(y),10] for y in range(len(rows))] | |
523 for x in range(len(self.curs.description)): | |
524 if str(self.curs.description[x][1]) == "<type 'cx_Oracle.BINARY'>": # handles RAW columns | |
525 rname = transpr[x][0] | |
526 transpr[x] = map(binascii.b2a_hex, transpr[x]) | |
527 transpr[x][0] = rname | |
528 self.debg=transpr | |
529 newdesc[0][0] = 'COLUMN NAME' | |
530 result = '\n' + sqlpython.pmatrix(transpr,newdesc) | |
488 else: | 531 else: |
489 result = sqlpython.pmatrix(self.rows, self.curs.description, self.maxfetch) | 532 result = sqlpython.pmatrix(self.rows, self.curs.description, self.maxfetch) |
490 return result | 533 return result |
491 | 534 |
492 def do_select(self, arg, bindVarsIn=None): | 535 def do_select(self, arg, bindVarsIn=None, override_terminator=None): |
493 """Fetch rows from a table. | 536 """Fetch rows from a table. |
494 | 537 |
495 Limit the number of rows retrieved by appending | 538 Limit the number of rows retrieved by appending |
496 an integer after the terminator | 539 an integer after the terminator |
497 (example: SELECT * FROM mytable;10 ) | 540 (example: SELECT * FROM mytable;10 ) |
500 ("help terminators" for details) | 543 ("help terminators" for details) |
501 """ | 544 """ |
502 bindVarsIn = bindVarsIn or {} | 545 bindVarsIn = bindVarsIn or {} |
503 self.query = 'select ' + arg | 546 self.query = 'select ' + arg |
504 (self.query, terminator, rowlimit) = sqlpython.findTerminator(self.query) | 547 (self.query, terminator, rowlimit) = sqlpython.findTerminator(self.query) |
548 if override_terminator: | |
549 terminator = override_terminator | |
505 rowlimit = int(rowlimit or 0) | 550 rowlimit = int(rowlimit or 0) |
506 if terminator == '\\t': | 551 try: |
507 self.do_tselect(' '.join(self.query.split()[1:]) + ';', rowlimit) | 552 self.varsUsed = findBinds(self.query, self.binds, bindVarsIn) |
508 return | 553 self.curs.execute(self.query, self.varsUsed) |
509 else: | 554 self.rows = self.curs.fetchmany(min(self.maxfetch, (rowlimit or self.maxfetch))) |
510 try: | 555 self.desc = self.curs.description |
511 self.varsUsed = findBinds(self.query, self.binds, bindVarsIn) | 556 self.rc = self.curs.rowcount |
512 self.curs.execute(self.query, self.varsUsed) | 557 if self.rc > 0: |
513 self.rows = self.curs.fetchmany(min(self.maxfetch, (rowlimit or self.maxfetch))) | 558 print '\n' + self.output(terminator, rowlimit) |
514 self.desc = self.curs.description | 559 if self.rc == 0: |
515 self.rc = self.curs.rowcount | 560 print '\nNo rows Selected.\n' |
516 if self.rc > 0: | 561 elif self.rc == 1: |
517 print '\n' + self.output(terminator, rowlimit) | 562 print '\n1 row selected.\n' |
518 if self.rc == 0: | 563 if self.autobind: |
519 print '\nNo rows Selected.\n' | 564 self.binds.update(dict(zip([d[0] for d in self.desc], self.rows[0]))) |
520 elif self.rc == 1: | 565 elif self.rc < self.maxfetch: |
521 print '\n1 row selected.\n' | 566 print '\n%d rows selected.\n' % self.rc |
522 if self.autobind: | 567 else: |
523 self.binds.update(dict(zip([d[0] for d in self.desc], self.rows[0]))) | 568 print '\nSelected Max Num rows (%d)' % self.rc |
524 elif self.rc < self.maxfetch: | 569 except Exception, e: |
525 print '\n%d rows selected.\n' % self.rc | 570 print e |
526 else: | 571 import traceback |
527 print '\nSelected Max Num rows (%d)' % self.rc | 572 traceback.print_exc(file=sys.stdout) |
528 except Exception, e: | |
529 print e | |
530 import traceback | |
531 traceback.print_exc(file=sys.stdout) | |
532 self.sqlBuffer.append(self.query) | 573 self.sqlBuffer.append(self.query) |
533 | 574 |
534 def showParam(self, param): | 575 def showParam(self, param): |
535 param = param.strip().lower() | 576 param = param.strip().lower() |
536 if param in self.settable: | 577 if param in self.settable: |
584 | 625 |
585 def do_describe(self, arg): | 626 def do_describe(self, arg): |
586 "emulates SQL*Plus's DESCRIBE" | 627 "emulates SQL*Plus's DESCRIBE" |
587 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) | 628 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) |
588 print "%s %s.%s" % (object_type, owner, object_name) | 629 print "%s %s.%s" % (object_type, owner, object_name) |
589 if object_type in ('TABLE','VIEW','PROCEDURE','FUNCTION','TRIGGER'): | 630 descQ = descQueries.get(object_type) |
590 self.do_select(descQueries[object_type],{'object_name':object_name, 'owner':owner}) | 631 if descQ: |
632 for q in descQ: | |
633 self.do_select(q,bindVarsIn={'object_name':object_name, 'owner':owner}) | |
591 elif object_type == 'PACKAGE': | 634 elif object_type == 'PACKAGE': |
592 self.curs.execute(descQueries['PackageObjects'], {'package_name':object_name, 'owner':owner}) | 635 self.curs.execute(descQueries['PackageObjects'], {'package_name':object_name, 'owner':owner}) |
593 for (packageObj_name,) in self.curs: | 636 for (packageObj_name,) in self.curs: |
594 print packageObj_name | 637 print packageObj_name |
595 self.do_select(descQueries['PackageObjArgs'],{'package_name':object_name, 'owner':owner, 'object_name':packageObj_name}) | 638 self.do_select(descQueries['PackageObjArgs'],bindVarsIn={'package_name':object_name, 'owner':owner, 'object_name':packageObj_name}) |
596 do_desc = do_describe | 639 do_desc = do_describe |
597 | 640 |
598 def do_comments(self, arg): | 641 def do_comments(self, arg): |
599 'Prints comments on a table and its columns.' | 642 'Prints comments on a table and its columns.' |
600 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) | 643 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) |
601 if object_type: | 644 if object_type: |
602 self.curs.execute(queries['tabComments'],{'table_name':object_name, 'owner':owner}) | 645 self.curs.execute(queries['tabComments'],{'table_name':object_name, 'owner':owner}) |
603 print "%s %s.%s: %s" % (object_type, owner, object_name, self.curs.fetchone()[0]) | 646 print "%s %s.%s: %s" % (object_type, owner, object_name, self.curs.fetchone()[0]) |
604 self.do_select(queries['colComments'],{'owner':owner, 'object_name': object_name}) | 647 self.do_select(queries['colComments'],bindVarsIn={'owner':owner, 'object_name': object_name}) |
605 | 648 |
606 def resolve(self, identifier): | 649 def resolve(self, identifier): |
607 """Checks (my objects).name, (my synonyms).name, (public synonyms).name | 650 """Checks (my objects).name, (my synonyms).name, (public synonyms).name |
608 to resolve a database object's name. """ | 651 to resolve a database object's name. """ |
609 parts = identifier.split('.') | 652 parts = identifier.split('.') |