Mercurial > sqlpython
annotate sqlpyPlus.py @ 8:8e909570e7de
history works
author | catherine@serenity.wpafb.af.mil |
---|---|
date | Thu, 06 Dec 2007 10:37:59 -0500 |
parents | d44784122203 |
children | 2ef0e2608123 |
rev | line source |
---|---|
0 | 1 """sqlpyPlus - extra features (inspired by Oracle SQL*Plus) for Luca Canali's sqlpython.py |
2 | |
3 Features include: | |
4 - SQL*Plus-style bind variables | |
5 - Query result stored in special bind variable ":_" if one row, one item | |
6 - SQL buffer with list, run, ed, get, etc.; unlike SQL*Plus, buffer stores session's full history | |
7 - @script.sql loads and runs (like SQL*Plus) | |
8 - ! runs operating-system command | |
9 - show and set to control sqlpython parameters | |
10 - SQL*Plus-style describe, spool | |
11 - write sends query result directly to file | |
12 - comments shows table and column comments | |
13 - compare ... to ... graphically compares results of two queries | |
14 - commands are case-insensitive | |
15 | |
16 Use 'help' within sqlpython for details. | |
17 | |
18 Compatible with sqlpython v1.3 | |
19 | |
20 Set bind variables the hard (SQL*Plus) way | |
21 exec :b = 3 | |
22 or with a python-like shorthand | |
23 :b = 3 | |
24 | |
25 - catherinedevlin.blogspot.com May 31, 2006 | |
26 """ | |
27 # note in cmd.cmd about supporting emacs commands? | |
28 | |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
29 pullQueries = { |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
30 'PROCEDURE':(""" |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
31 text |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
32 FROM all_source |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
33 WHERE owner = :owner |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
34 AND name = :object_name |
6
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
35 """,), |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
36 'PACKAGE':(""" |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
37 text |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
38 FROM all_source |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
39 WHERE owner = :owner |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
40 AND name = :object_name |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
41 AND type = 'PACKAGE_BODY' |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
42 """,), |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
43 'TYPE':(""" |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
44 text |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
45 FROM all_source |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
46 WHERE owner = :owner |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
47 AND name = :object_name |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
48 AND type = 'TYPE' |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
49 """, |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
50 """ |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
51 text |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
52 FROM all_source |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
53 WHERE owner = :owner |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
54 AND name = :object_name |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
55 AND type = 'TYPE_BODY' |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
56 """,) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
57 } |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
58 pullQueries['TRIGGER'] = pullQueries['PROCEDURE'] |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
59 pullQueries['FUNCTION'] = pullQueries['PROCEDURE'] |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
60 |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
61 descQueries = { |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
62 'TABLE': (""" |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
63 atc.column_name, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
64 CASE atc.nullable WHEN 'Y' THEN 'NULL' ELSE 'NOT NULL' END "Null?", |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
65 atc.data_type || |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
66 CASE atc.data_type WHEN 'DATE' THEN '' |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
67 ELSE '(' || |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
68 CASE atc.data_type WHEN 'NUMBER' THEN TO_CHAR(atc.data_precision) || |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
69 CASE atc.data_scale WHEN 0 THEN '' |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
70 ELSE ',' || TO_CHAR(atc.data_scale) END |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
71 ELSE TO_CHAR(atc.data_length) END |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
72 END || |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
73 CASE atc.data_type WHEN 'DATE' THEN '' ELSE ')' END |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
74 data_type |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
75 FROM all_tab_columns atc |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
76 WHERE atc.table_name = :object_name |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
77 AND atc.owner = :owner |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
78 ORDER BY atc.column_id;""",), |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
79 'PROCEDURE': (""" |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
80 argument_name, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
81 data_type, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
82 in_out, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
83 default_value |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
84 FROM all_arguments |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
85 WHERE object_name = :object_name |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
86 AND owner = :owner |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
87 AND package_name IS NULL |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
88 AND argument_name IS NOT NULL |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
89 ORDER BY sequence;""",), |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
90 'PackageObjects':(""" |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
91 SELECT DISTINCT object_name |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
92 FROM all_arguments |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
93 WHERE package_name = :package_name |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
94 AND owner = :owner""",), |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
95 'PackageObjArgs':(""" |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
96 object_name, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
97 argument_name, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
98 data_type, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
99 in_out, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
100 default_value |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
101 FROM all_arguments |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
102 WHERE package_name = :package_name |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
103 AND object_name = :object_name |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
104 AND owner = :owner |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
105 AND argument_name IS NOT NULL |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
106 ORDER BY sequence""",), |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
107 'TRIGGER':(""" |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
108 description |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
109 FROM all_triggers |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
110 WHERE owner = :owner |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
111 AND trigger_name = :object_name |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
112 """, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
113 """ |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
114 table_owner, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
115 base_object_type, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
116 table_name, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
117 column_name, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
118 when_clause, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
119 status, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
120 action_type, |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
121 crossedition |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
122 FROM all_triggers |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
123 WHERE owner = :owner |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
124 AND trigger_name = :object_name |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
125 \\t |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
126 """, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
127 ), |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
128 'INDEX':(""" |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
129 index_type, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
130 table_owner, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
131 table_name, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
132 table_type, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
133 uniqueness, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
134 compression, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
135 partitioned, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
136 temporary, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
137 generated, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
138 secondary, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
139 dropped, |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
140 visibility |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
141 FROM all_indexes |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
142 WHERE owner = :owner |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
143 AND index_name = :object_name |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
144 \\t |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
145 """,) |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
146 } |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
147 descQueries['VIEW'] = descQueries['TABLE'] |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
148 descQueries['FUNCTION'] = descQueries['PROCEDURE'] |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
149 |
0 | 150 queries = { |
151 'resolve': """ | |
152 SELECT object_type, object_name, owner FROM ( | |
153 SELECT object_type, object_name, user owner, 1 priority | |
154 FROM user_objects | |
155 WHERE object_name = :objName | |
156 UNION ALL | |
157 SELECT ao.object_type, ao.object_name, ao.owner, 2 priority | |
158 FROM all_objects ao | |
159 JOIN user_synonyms us ON (us.table_owner = ao.owner AND us.table_name = ao.object_name) | |
160 WHERE us.synonym_name = :objName | |
161 AND ao.object_type != 'SYNONYM' | |
162 UNION ALL | |
163 SELECT ao.object_type, ao.object_name, ao.owner, 3 priority | |
164 FROM all_objects ao | |
165 JOIN all_synonyms asyn ON (asyn.table_owner = ao.owner AND asyn.table_name = ao.object_name) | |
166 WHERE asyn.synonym_name = :objName | |
167 AND ao.object_type != 'SYNONYM' | |
168 AND asyn.owner = 'PUBLIC' | |
6
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
169 UNION ALL |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
170 SELECT 'DIRECTORY' object_type, dir.directory_name, dir.owner, 6 priority |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
171 FROM all_directories dir |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
172 WHERE dir.directory_name = :objName |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
173 UNION ALL |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
174 SELECT 'DATABASE LINK' object_type, db_link, owner, 7 priority |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
175 FROM all_db_links dbl |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
176 WHERE dbl.db_link = :objName |
0 | 177 ) ORDER BY priority ASC""", |
178 'tabComments': """ | |
179 SELECT comments | |
180 FROM all_tab_comments | |
181 WHERE owner = :owner | |
182 AND table_name = :table_name""", | |
183 'colComments': """ | |
184 atc.column_name, | |
185 acc.comments | |
186 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) | |
188 WHERE atc.table_name = :object_name | |
189 AND atc.owner = :owner | |
190 ORDER BY atc.column_id;""", | |
191 } | |
192 | |
193 import sys, os, re, sqlpython, cx_Oracle, pyparsing | |
194 | |
195 if float(sys.version[:3]) < 2.3: | |
196 def enumerate(lst): | |
197 return zip(range(len(lst)), lst) | |
198 | |
199 class SoftwareSearcher(object): | |
200 def __init__(self, softwareList, purpose): | |
201 self.softwareList = softwareList | |
202 self.purpose = purpose | |
203 self.software = None | |
204 def invoke(self, *args): | |
205 if not self.software: | |
206 (self.software, self.invokeString) = self.find() | |
207 argTuple = tuple([self.software] + list(args)) | |
208 os.system(self.invokeString % argTuple) | |
209 def find(self): | |
210 if self.purpose == 'text editor': | |
211 software = os.environ.get('EDITOR') | |
212 if software: | |
213 return (software, '%s %s') | |
214 for (n, (software, invokeString)) in enumerate(self.softwareList): | |
215 if os.path.exists(software): | |
216 if n > (len(self.softwareList) * 0.7): | |
217 print """ | |
218 | |
219 Using %s. Note that there are better options available for %s, | |
220 but %s couldn't find a better one in your PATH. | |
221 Feel free to open up %s | |
222 and customize it to find your favorite %s program. | |
223 | |
224 """ % (software, self.purpose, __file__, __file__, self.purpose) | |
225 return (software, invokeString) | |
226 stem = os.path.split(software)[1] | |
227 for p in os.environ['PATH'].split(os.pathsep): | |
228 if os.path.exists(os.sep.join([p, stem])): | |
229 return (stem, invokeString) | |
230 raise (OSError, """Could not find any %s programs. You will need to install one, | |
231 or customize %s to make it aware of yours. | |
232 Looked for these programs: | |
233 %s""" % (self.purpose, __file__, "\n".join([s[0] for s in self.softwareList]))) | |
234 #v2.4: %s""" % (self.purpose, __file__, "\n".join(s[0] for s in self.softwareList))) | |
235 | |
236 softwareLists = { | |
237 'diff/merge': [ | |
238 ('/usr/bin/meld',"%s %s %s"), | |
239 ('/usr/bin/kdiff3',"%s %s %s"), | |
240 (r'C:\Program Files\Araxis\Araxis Merge v6.5\Merge.exe','"%s" %s %s'), | |
241 (r'C:\Program Files\TortoiseSVN\bin\TortoiseMerge.exe', '"%s" /base:"%s" /mine:"%s"'), | |
242 ('FileMerge','%s %s %s'), | |
243 ('kompare','%s %s %s'), | |
244 ('WinMerge','%s %s %s'), | |
245 ('xxdiff','%s %s %s'), | |
246 ('fldiff','%s %s %s'), | |
247 ('gtkdiff','%s %s %s'), | |
248 ('tkdiff','%s %s %s'), | |
249 ('gvimdiff','%s %s %s'), | |
250 ('diff',"%s %s %s"), | |
251 (r'c:\windows\system32\comp.exe',"%s %s %s")], | |
252 'text editor': [ | |
253 ('gedit', '%s %s'), | |
254 ('textpad', '%s %s'), | |
255 ('notepad.exe', '%s %s'), | |
256 ('pico', '%s %s'), | |
257 ('emacs', '%s %s'), | |
258 ('vim', '%s %s'), | |
259 ('vi', '%s %s'), | |
260 ('ed', '%s %s'), | |
261 ('edlin', '%s %s') | |
262 ] | |
263 } | |
264 | |
265 diffMergeSearcher = SoftwareSearcher(softwareLists['diff/merge'],'diff/merge') | |
266 editSearcher = SoftwareSearcher(softwareLists['text editor'], 'text editor') | |
267 editor = os.environ.get('EDITOR') | |
268 if editor: | |
269 editSearcher.find = lambda: (editor, "%s %s") | |
270 | |
271 class CaselessDict(dict): | |
272 """dict with case-insensitive keys. | |
273 | |
274 Posted to ASPN Python Cookbook by Jeff Donner - http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/66315""" | |
275 def __init__(self, other=None): | |
276 if other: | |
277 # Doesn't do keyword args | |
278 if isinstance(other, dict): | |
279 for k,v in other.items(): | |
280 dict.__setitem__(self, k.lower(), v) | |
281 else: | |
282 for k,v in other: | |
283 dict.__setitem__(self, k.lower(), v) | |
284 def __getitem__(self, key): | |
285 return dict.__getitem__(self, key.lower()) | |
286 def __setitem__(self, key, value): | |
287 dict.__setitem__(self, key.lower(), value) | |
288 def __contains__(self, key): | |
289 return dict.__contains__(self, key.lower()) | |
290 def has_key(self, key): | |
291 return dict.has_key(self, key.lower()) | |
292 def get(self, key, def_val=None): | |
293 return dict.get(self, key.lower(), def_val) | |
294 def setdefault(self, key, def_val=None): | |
295 return dict.setdefault(self, key.lower(), def_val) | |
296 def update(self, other): | |
297 for k,v in other.items(): | |
298 dict.__setitem__(self, k.lower(), v) | |
299 def fromkeys(self, iterable, value=None): | |
300 d = CaselessDict() | |
301 for k in iterable: | |
302 dict.__setitem__(d, k.lower(), value) | |
303 return d | |
304 def pop(self, key, def_val=None): | |
305 return dict.pop(self, key.lower(), def_val) | |
306 | |
307 class NotSettableError(Exception): | |
308 None | |
309 | |
310 class Parser(object): | |
311 comment_def = "--" + pyparsing.ZeroOrMore(pyparsing.CharsNotIn("\n")) | |
312 def __init__(self, scanner, retainSeparator=True): | |
313 self.scanner = scanner | |
314 self.scanner.ignore(pyparsing.sglQuotedString) | |
315 self.scanner.ignore(pyparsing.dblQuotedString) | |
316 self.scanner.ignore(self.comment_def) | |
317 self.scanner.ignore(pyparsing.cStyleComment) | |
318 self.retainSeparator = retainSeparator | |
319 def separate(self, txt): | |
320 itms = [] | |
321 for (sqlcommand, start, end) in self.scanner.scanString(txt): | |
322 if sqlcommand: | |
323 if type(sqlcommand[0]) == pyparsing.ParseResults: | |
324 if self.retainSeparator: | |
325 itms.append("".join(sqlcommand[0])) | |
326 else: | |
327 itms.append(sqlcommand[0][0]) | |
328 else: | |
329 if sqlcommand[0]: | |
330 itms.append(sqlcommand[0]) | |
331 return itms | |
332 | |
333 pipeSeparator = Parser(pyparsing.SkipTo((pyparsing.Literal('|') ^ pyparsing.StringEnd()), include=True), retainSeparator=False) | |
334 bindScanner = Parser(pyparsing.Literal(':') + pyparsing.Word( pyparsing.alphanums + "_$#" )) | |
335 commandSeparator = Parser(pyparsing.SkipTo((pyparsing.Literal(';') ^ pyparsing.StringEnd()), include=True)) | |
336 | |
337 def findBinds(target, existingBinds, givenBindVars = {}): | |
338 result = givenBindVars | |
339 for finding, startat, endat in bindScanner.scanner.scanString(target): | |
340 varname = finding[1] | |
341 try: | |
342 result[varname] = existingBinds[varname] | |
343 except KeyError: | |
344 if not givenBindVars.has_key(varname): | |
345 print 'Bind variable %s not defined.' % (varname) | |
346 return result | |
347 | |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
348 class HistoryItem(str): |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
349 def __init__(self, instr): |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
350 str.__init__(self, instr) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
351 self.lowercase = self.lower() |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
352 self.idx = None |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
353 def pr(self): |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
354 print '-------------------------[%d]' % (self.idx) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
355 print self |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
356 |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
357 class History(list): |
8 | 358 rangeFrom = re.compile(r'^([\d])+\s*\-$') |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
359 def append(self, new): |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
360 new = HistoryItem(new) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
361 list.append(self, new) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
362 new.idx = len(self) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
363 def extend(self, new): |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
364 for n in new: |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
365 self.append(n) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
366 def get(self, getme): |
8 | 367 try: |
368 getme = int(getme) | |
369 if getme < 0: | |
370 return self[:(-1 * getme)] | |
371 else: | |
372 return self[getme-1] | |
373 except IndexError: | |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
374 return [] |
8 | 375 except (ValueError, TypeError): |
376 getme = getme.strip() | |
377 mtch = self.rangeFrom.search(getme) | |
378 if mtch: | |
379 return self[(int(mtch.group(1))-1):] | |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
380 if getme.startswith(r'/') and getme.endswith(r'/'): |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
381 finder = re.compile(getme[1:-1], re.DOTALL | re.MULTILINE | re.IGNORECASE) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
382 def isin(hi): |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
383 return finder.search(hi) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
384 else: |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
385 def isin(hi): |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
386 return (getme.lower() in hi.lowercase) |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
387 return [itm for itm in self if isin(itm)] |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
388 |
0 | 389 class sqlpyPlus(sqlpython.sqlpython): |
390 def __init__(self): | |
391 sqlpython.sqlpython.__init__(self) | |
392 self.binds = CaselessDict() | |
393 self.sqlBuffer = [] | |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
394 self.history = History() |
0 | 395 self.settable = ['maxtselctrows', 'maxfetch', 'autobind', 'failover', 'timeout'] # settables must be lowercase |
396 self.stdoutBeforeSpool = sys.stdout | |
397 self.spoolFile = None | |
398 self.autobind = False | |
399 self.failover = False | |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
400 self.multiline = '''select insert update delete tselect |
2
59903dcaf327
working on history
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
1
diff
changeset
|
401 create drop alter'''.split() |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
402 self.excludeFromHistory = '''run r list l history hi ed'''.split() |
0 | 403 |
404 def default(self, arg, do_everywhere=False): | |
405 sqlpython.sqlpython.default(self, arg, do_everywhere) | |
406 self.sqlBuffer.append(self.query) | |
407 | |
408 # overrides cmd's parseline | |
409 shortcuts = {'?': 'help', '@': 'getrun', '!': 'shell', ':': 'setbind', '\\': 'psql'} | |
410 def parseline(self, line): | |
411 """Parse the line into a command name and a string containing | |
412 the arguments. Returns a tuple containing (command, args, line). | |
413 'command' and 'args' may be None if the line couldn't be parsed. | |
414 Overrides cmd.cmd.parseline to accept variety of shortcuts..""" | |
415 line = line.strip() | |
416 if not line: | |
417 return None, None, line | |
418 shortcut = self.shortcuts.get(line[0]) | |
419 if shortcut: | |
420 cmd, arg = shortcut, line[1:].strip() | |
421 else: | |
422 i, n = 0, len(line) | |
423 while i < n and line[i] in self.identchars: i = i+1 | |
424 cmd, arg = line[:i], line[i:].strip() | |
425 if cmd.lower() in ('select', 'sleect', 'insert', 'update', 'delete', 'describe', | |
426 'desc', 'comments') \ | |
427 and not hasattr(self, 'curs'): | |
428 print 'Not connected.' | |
429 return '', '', '' | |
430 return cmd, arg, line | |
431 | |
432 def precmd(self, line): | |
433 """Hook method executed just before the command line is | |
434 interpreted, but after the input prompt is generated and issued. | |
435 Makes commands case-insensitive (but unfortunately does not alter command completion). | |
436 """ | |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
437 |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
438 ''' |
0 | 439 pipedCommands = pipeSeparator.separate(line) |
440 if len(pipedCommands) > 1: | |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
441 pipefilename = 'sqlpython.pipe.tmp' |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
442 for (idx, pipedCommand) in enumerate(pipedCommands[:-1]): |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
443 savestdout = sys.stdout |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
444 f = open(pipefilename,'w') |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
445 sys.stdout = f |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
446 self.precmd(pipedCommand) |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
447 self.onecmd(pipedCommand) |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
448 self.postcmd(False, pipedCommands[0]) |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
449 f.close() |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
450 sys.stdout = savestdout |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
451 f = os.popen('%s < %s' % (pipedCommands[idx+1], pipefilename)) |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
452 f.read() |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
453 |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
454 ''' |
0 | 455 try: |
456 args = line.split(None,1) | |
457 args[0] = args[0].lower() | |
2
59903dcaf327
working on history
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
1
diff
changeset
|
458 statement = ' '.join(args) |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
459 if args[0] in self.multiline: |
2
59903dcaf327
working on history
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
1
diff
changeset
|
460 statement = sqlpython.finishStatement(statement) |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
461 return statement |
0 | 462 except Exception: |
463 return line | |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
464 |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
465 def postcmd(self, stop, line): |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
466 """Hook method executed just after a command dispatch is finished.""" |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
467 command = line.split(None,1)[0].lower() |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
468 if command not in self.excludeFromHistory: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
469 self.history.append(line) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
470 return stop |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
471 |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
472 def onecmd_plus_hooks(self, line): |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
473 line = self.precmd(line) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
474 stop = self.onecmd(line) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
475 stop = self.postcmd(stop, line) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
476 |
0 | 477 def do_shortcuts(self,arg): |
478 """Lists available first-character shortcuts | |
479 (i.e. '!dir' is equivalent to 'shell dir')""" | |
480 for (scchar, scto) in self.shortcuts.items(): | |
481 print '%s: %s' % (scchar, scto) | |
482 | |
483 | |
484 def colnames(self): | |
485 return [d[0] for d in curs.description] | |
486 | |
487 def sql_format_itm(self, itm, needsquotes): | |
488 if itm is None: | |
489 return 'NULL' | |
490 if needsquotes: | |
491 return "'%s'" % str(itm) | |
492 return str(itm) | |
493 def output_as_insert_statements(self): | |
494 usequotes = [d[1] != cx_Oracle.NUMBER for d in self.curs.description] | |
495 def formatRow(row): | |
496 return ','.join(self.sql_format_itm(itm, useq) | |
497 for (itm, useq) in zip(row, usequotes)) | |
498 result = ['INSERT INTO %s (%s) VALUES (%s);' % | |
499 (self.tblname, ','.join(self.colnames), formatRow(row)) | |
500 for row in self.rows] | |
501 return '\n'.join(result) | |
502 | |
503 def output_row_as_xml(self, row): | |
504 result = [' <%s>\n %s\n </%s>' % | |
505 (colname.lower(), str('' if (itm is None) else itm), colname.lower()) | |
506 for (itm, colname) in zip(row, self.colnames)] | |
507 return '\n'.join(result) | |
508 def output_as_xml(self): | |
509 result = ['<%s>\n%s\n</%s>' % | |
510 (self.tblname, self.output_row_as_xml(row), self.tblname) | |
511 for row in self.rows] | |
512 return '\n'.join(result) | |
513 | |
514 def output_as_html_table(self): | |
515 result = ''.join('<th>%s</th>' % c for c in self.colnames) | |
516 result = [' <tr>\n %s\n </tr>' % result] | |
517 for row in self.rows: | |
518 result.append(' <tr>\n %s\n </tr>' % | |
519 (''.join('<td>%s</td>' % | |
520 str('' if (itm is None) else itm) | |
521 for itm in row))) | |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
522 result = '''<table id="%s"> |
0 | 523 %s |
524 </table>''' % (self.tblname, '\n'.join(result)) | |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
525 return result |
0 | 526 |
527 def output_as_list(self, align): | |
528 result = [] | |
529 colnamelen = max(len(colname) for colname in self.colnames) + 1 | |
530 for (idx, row) in enumerate(self.rows): | |
531 result.append('\n**** Row: %d' % (idx+1)) | |
532 for (itm, colname) in zip(row, self.colnames): | |
533 if align: | |
534 colname = colname.ljust(colnamelen) | |
535 result.append('%s: %s' % (colname, itm)) | |
536 return '\n'.join(result) | |
537 | |
538 tableNameFinder = re.compile(r'from\s+([\w$#_"]+)', re.IGNORECASE | re.MULTILINE | re.DOTALL) | |
539 def output(self, outformat, rowlimit): | |
540 self.tblname = self.tableNameFinder.search(self.curs.statement).group(1) | |
541 self.colnames = [d[0] for d in self.curs.description] | |
542 if outformat == '\\i': | |
543 result = self.output_as_insert_statements() | |
544 elif outformat == '\\x': | |
545 result = self.output_as_xml() | |
546 elif outformat == '\\g': | |
547 result = self.output_as_list(align=False) | |
548 elif outformat == '\\G': | |
549 result = self.output_as_list(align=True) | |
550 elif outformat in ('\\s', '\\S', '\\c', '\\C'): #csv | |
551 result = [] | |
552 if outformat in ('\\s', '\\c'): | |
553 result.append(','.join('"%s"' % colname for colname in self.colnames)) | |
554 for row in self.rows: | |
555 result.append(','.join('"%s"' % ('' if itm is None else itm) for itm in row)) | |
556 result = '\n'.join(result) | |
557 elif outformat == '\\h': | |
558 result = self.output_as_html_table() | |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
559 elif outformat == '\\t': |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
560 rows = [self.colnames] |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
561 rows.extend(list(self.rows)) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
562 transpr = [[rows[y][x] for y in range(len(rows))]for x in range(len(rows[0]))] # matrix transpose |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
563 newdesc = [['ROW N.'+str(y),10] for y in range(len(rows))] |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
564 for x in range(len(self.curs.description)): |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
565 if str(self.curs.description[x][1]) == "<type 'cx_Oracle.BINARY'>": # handles RAW columns |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
566 rname = transpr[x][0] |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
567 transpr[x] = map(binascii.b2a_hex, transpr[x]) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
568 transpr[x][0] = rname |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
569 self.debg=transpr |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
570 newdesc[0][0] = 'COLUMN NAME' |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
571 result = '\n' + sqlpython.pmatrix(transpr,newdesc) |
0 | 572 else: |
573 result = sqlpython.pmatrix(self.rows, self.curs.description, self.maxfetch) | |
574 return result | |
575 | |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
576 def do_select(self, arg, bindVarsIn=None, override_terminator=None): |
0 | 577 """Fetch rows from a table. |
578 | |
579 Limit the number of rows retrieved by appending | |
580 an integer after the terminator | |
581 (example: SELECT * FROM mytable;10 ) | |
582 | |
583 Output may be formatted by choosing an alternative terminator | |
584 ("help terminators" for details) | |
585 """ | |
586 bindVarsIn = bindVarsIn or {} | |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
587 self.query = 'select ' + arg |
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
588 (self.query, terminator, rowlimit) = sqlpython.findTerminator(self.query) |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
589 if override_terminator: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
590 terminator = override_terminator |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
591 rowlimit = int(rowlimit or 0) |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
592 try: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
593 self.varsUsed = findBinds(self.query, self.binds, bindVarsIn) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
594 self.curs.execute(self.query, self.varsUsed) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
595 self.rows = self.curs.fetchmany(min(self.maxfetch, (rowlimit or self.maxfetch))) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
596 self.desc = self.curs.description |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
597 self.rc = self.curs.rowcount |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
598 if self.rc > 0: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
599 print '\n' + self.output(terminator, rowlimit) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
600 if self.rc == 0: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
601 print '\nNo rows Selected.\n' |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
602 elif self.rc == 1: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
603 print '\n1 row selected.\n' |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
604 if self.autobind: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
605 self.binds.update(dict(zip([d[0] for d in self.desc], self.rows[0]))) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
606 elif self.rc < self.maxfetch: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
607 print '\n%d rows selected.\n' % self.rc |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
608 else: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
609 print '\nSelected Max Num rows (%d)' % self.rc |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
610 except Exception, e: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
611 print e |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
612 import traceback |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
613 traceback.print_exc(file=sys.stdout) |
0 | 614 self.sqlBuffer.append(self.query) |
615 | |
616 def showParam(self, param): | |
617 param = param.strip().lower() | |
618 if param in self.settable: | |
619 val = getattr(self, param) | |
620 print '%s: %s' % (param, str(getattr(self, param))) | |
621 | |
622 def do_show(self, arg): | |
623 'Shows value of a (sqlpython, not ORACLE) parameter' | |
624 arg = arg.strip().lower() | |
625 if arg: | |
626 self.showParam(arg) | |
627 else: | |
628 for param in self.settable: | |
629 self.showParam(param) | |
630 | |
631 def cast(self, current, new): | |
632 typ = type(current) | |
633 if typ == bool: | |
634 new = new.lower() | |
635 try: | |
636 if (new=='on') or (new[0] in ('y','t')): | |
637 return True | |
638 return False | |
639 except TypeError: | |
640 None | |
641 try: | |
642 return typ(new) | |
643 except: | |
644 print "Problem setting parameter (now %s) to %s; incorrect type?" % (current, new) | |
645 return current | |
646 | |
647 def do_set(self, arg): | |
648 'Sets a (sqlpython, not ORACLE) parameter' | |
649 try: | |
650 paramName, val = arg.split(None, 1) | |
651 except Exception: | |
652 self.do_show(arg) | |
653 return | |
654 paramName = paramName.lower() | |
655 try: | |
656 current = getattr(self, paramName) | |
657 if callable(current): | |
658 raise NotSettableError | |
659 except (AttributeError, NotSettableError): | |
660 self.fail('set %s' % arg) | |
661 return | |
662 val = self.cast(current, val.strip(';')) | |
663 print paramName, ' - was: ', current | |
664 setattr(self, paramName.lower(), val) | |
665 print 'now: ', val | |
6
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
666 |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
667 def do_pull(self, arg): |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
668 "Displays source code." |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
669 |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
670 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
671 print "%s %s.%s" % (object_type, owner, object_name) |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
672 pullQ = pullQueries.get(object_type) |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
673 if pullQ: |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
674 for q in pullQ: |
f9ec5c20beb4
working on resolving more objects
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
5
diff
changeset
|
675 self.do_select(q,bindVarsIn={'object_name':object_name, 'owner':owner}) |
0 | 676 |
677 def do_describe(self, arg): | |
678 "emulates SQL*Plus's DESCRIBE" | |
679 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) | |
680 print "%s %s.%s" % (object_type, owner, object_name) | |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
681 descQ = descQueries.get(object_type) |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
682 if descQ: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
683 for q in descQ: |
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
684 self.do_select(q,bindVarsIn={'object_name':object_name, 'owner':owner}) |
0 | 685 elif object_type == 'PACKAGE': |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
686 self.curs.execute(descQueries['PackageObjects'], {'package_name':object_name, 'owner':owner}) |
0 | 687 for (packageObj_name,) in self.curs: |
688 print packageObj_name | |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
689 self.do_select(descQueries['PackageObjArgs'],bindVarsIn={'package_name':object_name, 'owner':owner, 'object_name':packageObj_name}) |
0 | 690 do_desc = do_describe |
691 | |
692 def do_comments(self, arg): | |
693 'Prints comments on a table and its columns.' | |
694 object_type, owner, object_name = self.resolve(arg.strip(self.terminator).upper()) | |
695 if object_type: | |
696 self.curs.execute(queries['tabComments'],{'table_name':object_name, 'owner':owner}) | |
697 print "%s %s.%s: %s" % (object_type, owner, object_name, self.curs.fetchone()[0]) | |
5
65ae6cec71c6
expanded desc good so far
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
4
diff
changeset
|
698 self.do_select(queries['colComments'],bindVarsIn={'owner':owner, 'object_name': object_name}) |
0 | 699 |
700 def resolve(self, identifier): | |
701 """Checks (my objects).name, (my synonyms).name, (public synonyms).name | |
702 to resolve a database object's name. """ | |
703 parts = identifier.split('.') | |
704 try: | |
705 if len(parts) == 2: | |
706 owner, object_name = parts | |
707 self.curs.execute('SELECT object_type FROM all_objects WHERE owner = :owner AND object_name = :object_name', | |
708 {'owner': owner, 'object_name': object_name}) | |
709 object_type = self.curs.fetchone()[0] | |
710 elif len(parts) == 1: | |
711 object_name = parts[0] | |
712 self.curs.execute(queries['resolve'], {'objName':object_name}) | |
713 object_type, object_name, owner = self.curs.fetchone() | |
714 except TypeError: | |
715 print 'Could not resolve object %s.' % identifier | |
716 object_type, owner, object_name = '', '', '' | |
717 return object_type, owner, object_name | |
718 | |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
719 def do_resolve(self, arg): |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
720 print self.resolve(arg) |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
721 |
0 | 722 def do_shell(self, arg): |
723 'execute a command as if at the OS prompt.' | |
724 os.system(arg) | |
725 | |
726 def spoolstop(self): | |
727 if self.spoolFile: | |
728 sys.stdout = self.stdoutBeforeSpool | |
729 print 'Finished spooling to ', self.spoolFile.name | |
730 self.spoolFile.close() | |
731 self.spoolFile = None | |
732 | |
733 def do_spool(self, arg): | |
734 """spool [filename] - begins redirecting output to FILENAME.""" | |
735 self.spoolstop() | |
736 arg = arg.strip() | |
737 if not arg: | |
738 arg = 'output.lst' | |
739 if arg.lower() != 'off': | |
740 if '.' not in arg: | |
741 arg = '%s.lst' % arg | |
742 print 'Sending output to %s (until SPOOL OFF received)' % (arg) | |
743 self.spoolFile = open(arg, 'w') | |
744 sys.stdout = self.spoolFile | |
745 | |
746 def write(self, arg, fname): | |
747 originalOut = sys.stdout | |
748 f = open(fname, 'w') | |
749 sys.stdout = f | |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
750 self.onecmd_plus_hooks(arg) |
0 | 751 f.close() |
752 sys.stdout = originalOut | |
753 | |
754 def do_write(self, args): | |
755 'write [filename.extension] query - writes result to a file' | |
756 words = args.split(None, 1) | |
757 if len(words) > 1 and '.' in words[0]: | |
758 fname, command = words | |
759 else: | |
760 fname, command = 'output.txt', args | |
761 self.write(command, fname) | |
762 print 'Results written to %s' % os.path.join(os.getcwd(), fname) | |
763 | |
764 def do_compare(self, args): | |
765 """COMPARE query1 TO query2 - uses external tool to display differences. | |
766 | |
767 Sorting is recommended to avoid false hits.""" | |
768 fnames = [] | |
769 args2 = args.split(' to ') | |
770 for n in range(len(args2)): | |
771 query = args2[n] | |
772 fnames.append('compare%s.txt' % n) | |
773 if query.rstrip()[-1] != self.terminator: | |
774 query = '%s%s' % (query, self.terminator) | |
775 self.write(query, fnames[n]) | |
776 diffMergeSearcher.invoke(fnames[0], fnames[1]) | |
777 | |
778 bufferPosPattern = re.compile('\d+') | |
779 rangeIndicators = ('-',':') | |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
780 |
0 | 781 def do_run(self, arg): |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
782 """run [arg]: re-runs an earlier command |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
783 |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
784 no arg -> run most recent command |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
785 arg is integer -> run one history item, by index |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
786 arg is string -> run most recent command by string search |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
787 arg is /enclosed in forward-slashes/ -> run most recent by regex |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
788 """ |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
789 'run [N]: runs the SQL that was run N commands ago' |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
790 runme = self.last_matching(arg) |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
791 print runme |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
792 self.onecmd_plus_hooks(runme) |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
793 do_r = do_run |
1
8fa146b9a2d7
reworking multiline
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
0
diff
changeset
|
794 def do_history(self, arg): |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
795 """history [arg]: lists past commands issued |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
796 |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
797 no arg -> list all |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
798 arg is integer -> list one history item, by index |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
799 arg is string -> string search |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
800 arg is /enclosed in forward-slashes/ -> regular expression search |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
801 """ |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
802 if arg: |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
803 history = self.history.get(arg) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
804 else: |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
805 history = self.history |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
806 for hi in history: |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
807 hi.pr() |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
808 def last_matching(self, arg): |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
809 try: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
810 if arg: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
811 return self.history.get(arg)[-1] |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
812 else: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
813 return self.history[-1] |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
814 except: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
815 return None |
0 | 816 def do_list(self, arg): |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
817 """list [arg]: lists last command issued |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
818 |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
819 no arg -> list absolute last |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
820 arg is integer -> list one history item, by index |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
821 - arg, arg - (integer) -> list up to or after #arg |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
822 arg is string -> list last command matching string search |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
823 arg is /enclosed in forward-slashes/ -> regular expression search |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
824 """ |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
825 try: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
826 self.last_matching(arg).pr() |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
827 except: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
828 pass |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
829 do_hi = do_history |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
830 do_l = do_list |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
831 do_li = do_list |
0 | 832 def load(self, fname): |
833 """Pulls command(s) into sql buffer. Returns number of commands loaded.""" | |
834 try: | |
835 f = open(fname, 'r') | |
836 except IOError, e: | |
837 try: | |
838 f = open('%s.sql' % fname, 'r') | |
839 except: | |
840 print 'Problem opening file %s: \n%s' % (fname, e) | |
841 return 0 | |
842 txt = f.read() | |
843 f.close() | |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
844 result = commandSeparator.separate(txt) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
845 self.history.extend(result) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
846 return len(result) |
0 | 847 def do_ed(self, arg): |
848 'ed [N]: brings up SQL from N commands ago in text editor, and puts result in SQL buffer.' | |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
849 fname = 'sqlpython_temp.sql' |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
850 buffer = self.last_matching(arg) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
851 if not buffer: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
852 print 'Nothing appropriate in buffer to edit.' |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
853 return |
0 | 854 f = open(fname, 'w') |
855 f.write(buffer) | |
856 f.close() | |
857 editSearcher.invoke(fname) | |
858 self.load(fname) | |
859 do_edit = do_ed | |
860 def do_get(self, fname): | |
861 'Brings SQL commands from a file to the in-memory SQL buffer.' | |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
862 numCommandsLoaded = self.load(fname) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
863 if numCommandsLoaded: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
864 self.do_list('%d -' % (len(self.history) - numCommandsLoaded)) |
0 | 865 def do_getrun(self, fname): |
866 'Brings SQL commands from a file to the in-memory SQL buffer, and executes them.' | |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
867 numCommandsLoaded = self.load(fname) * -1 |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
868 if numCommandsLoaded: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
869 for command in self.history[numCommandsLoaded:]: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
870 self.onecmd_plus_hooks(command) |
0 | 871 def do_psql(self, arg): |
872 '''Shortcut commands emulating psql's backslash commands. | |
873 | |
874 \c connect | |
875 \d desc | |
876 \e edit | |
877 \g run | |
878 \h help | |
879 \i getrun | |
880 \o spool | |
881 \p list | |
882 \w save | |
883 \? help psql''' | |
884 commands = {} | |
885 for c in self.do_psql.__doc__.splitlines()[2:]: | |
886 (abbrev, command) = c.split(None, 1) | |
887 commands[abbrev[1:]] = command | |
888 words = arg.split(None,1) | |
889 abbrev = words[0] | |
890 try: | |
891 args = words[1] | |
892 except IndexError: | |
893 args = '' | |
894 try: | |
895 self.onecmd('%s %s' % (commands[abbrev], args)) | |
896 self.onecmd('q') | |
897 except KeyError: | |
898 print 'psql command \%s not yet supported.' % abbrev | |
899 def do_save(self, fname): | |
900 'save FILENAME: Saves most recent SQL command to disk.' | |
3
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
901 try: |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
902 f = open(fname, 'w') |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
903 f.write(self.sqlBuffer[-1]) |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
904 f.close() |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
905 except Exception, e: |
cd23cd62de3c
history working pretty well
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
2
diff
changeset
|
906 print 'Error saving %s: %s' % (fname, str(e)) |
0 | 907 |
908 def do_print(self, arg): | |
909 'print VARNAME: Show current value of bind variable VARNAME.' | |
910 if arg: | |
911 if arg[0] == ':': | |
912 arg = arg[1:] | |
913 try: | |
914 print self.binds[arg] | |
915 except KeyError: | |
916 print 'No bind variable ', arg | |
917 else: | |
918 self.do_setbind('') | |
919 def do_setbind(self, arg): | |
920 args = arg.split(None, 2) | |
921 if len(args) == 0: | |
922 for (var, val) in self.binds.items(): | |
923 print ':%s = %s' % (var, val) | |
924 elif len(args) == 1: | |
925 try: | |
926 print ':%s = %s' % (args[0], self.binds[args[0]]) | |
927 except KeyError, e: | |
928 print noSuchBindMsg % args[0] | |
929 elif len(args) > 2 and args[1] in ('=',':='): | |
930 var, val = args[0], args[2] | |
931 if val[0] == val[-1] == "'" and len(val) > 1: | |
932 val = val[1:-1] | |
933 self.binds[var] = val | |
934 else: | |
935 print 'Could not parse ', args | |
936 def do_exec(self, arg): | |
937 if arg[0] == ':': | |
938 self.do_setbind(arg[1:]) | |
939 else: | |
940 self.default('exec %s' % arg) | |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
941 |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
942 def do_cat(self, arg): |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
943 targets = arg.split() |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
944 for target in targets: |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
945 self.do_select('* from %s' % target) |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
946 |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
947 def do_grep(self, arg): |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
948 """grep PATTERN TABLE - search for term in any of TABLE's fields""" |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
949 targets = arg.split() |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
950 pattern = targets.pop(0) |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
951 for target in targets: |
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
952 sql = [] |
7
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
953 print 'select * from %s where 1=0' % target |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
954 try: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
955 self.curs.execute('select * from %s where 1=0' % target) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
956 sql = ' or '.join("%s LIKE '%%%s%%'" % (d[0], pattern) for d in self.curs.description) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
957 sql = '* FROM %s WHERE %s' % (target, sql) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
958 self.do_select(sql) |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
959 except Exception, e: |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
960 print e |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
961 import traceback |
d44784122203
more history tweaks
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
6
diff
changeset
|
962 traceback.print_exc(file=sys.stdout) |
4
23c3a58d7804
about to strip out tselect
devlinjs@FA7CZA6N1254998.wrightpatterson.afmc.ds.af.mil
parents:
3
diff
changeset
|
963 |
0 | 964 def _test(): |
965 import doctest | |
966 doctest.testmod() | |
967 | |
968 if __name__ == "__main__": | |
969 "Silent return implies that all unit tests succeeded. Use -v to see details." | |
970 _test() |