root / tags / v1_0_2_Build_912 / extensions / extScripting / scripts / jython / Lib / isql.py @ 11422
History | View | Annotate | Download (3.51 KB)
1 |
# $Id: isql.py 5782 2006-06-12 07:56:49Z jmvivo $
|
---|---|
2 |
|
3 |
import dbexts, cmd, sys |
4 |
|
5 |
"""
|
6 |
Isql works in conjunction with dbexts to provide an interactive environment
|
7 |
for database work.
|
8 |
"""
|
9 |
|
10 |
__version__ = "$Revision: 5782 $"[11:-2] |
11 |
|
12 |
class Prompt: |
13 |
"""
|
14 |
This class fixes a problem with the cmd.Cmd class since it uses an ivar 'prompt'
|
15 |
as opposed to a method 'prompt()'. To get around this, this class is plugged in
|
16 |
as a 'prompt' attribute and when invoked the '__str__' method is called which
|
17 |
figures out the appropriate prompt to display. I still think, even though this
|
18 |
is clever, the attribute version of 'prompt' is poor design.
|
19 |
"""
|
20 |
def __init__(self, isql): |
21 |
self.isql = isql
|
22 |
def __str__(self): |
23 |
prompt = "%s> " % (self.isql.db.dbname) |
24 |
if len(self.isql.sqlbuffer) > 0: |
25 |
prompt = "... "
|
26 |
return prompt
|
27 |
|
28 |
class IsqlCmd(cmd.Cmd): |
29 |
|
30 |
def __init__(self, db=None, delimiter=";"): |
31 |
cmd.Cmd.__init__(self)
|
32 |
if db is None or type(db) == type(""): |
33 |
self.db = dbexts.dbexts(db)
|
34 |
else:
|
35 |
self.db = db
|
36 |
self.kw = {}
|
37 |
self.sqlbuffer = []
|
38 |
self.delimiter = delimiter
|
39 |
self.prompt = Prompt(self) |
40 |
|
41 |
def do_which(self, arg): |
42 |
"""\nPrints the current db connection parameters.\n"""
|
43 |
print self.db |
44 |
return None |
45 |
|
46 |
def do_EOF(self, arg): |
47 |
return None |
48 |
|
49 |
def do_p(self, arg): |
50 |
"""\nExecute a python expression.\n"""
|
51 |
try:
|
52 |
exec arg.strip() in globals() |
53 |
except:
|
54 |
print sys.exc_info()[1] |
55 |
return None |
56 |
|
57 |
def do_use(self, arg): |
58 |
"""\nUse a new database connection.\n"""
|
59 |
self.db = dbexts.dbexts(arg.strip())
|
60 |
return None |
61 |
|
62 |
def do_table(self, arg): |
63 |
"""\nPrints table meta-data. If no table name, prints all tables.\n"""
|
64 |
if len(arg.strip()): |
65 |
apply(self.db.table, (arg,), self.kw) |
66 |
else:
|
67 |
apply(self.db.table, (None,), self.kw) |
68 |
return None |
69 |
|
70 |
def do_proc(self, arg): |
71 |
"""\nPrints store procedure meta-data.\n"""
|
72 |
if len(arg.strip()): |
73 |
apply(self.db.proc, (arg,), self.kw) |
74 |
else:
|
75 |
apply(self.db.proc, (None,), self.kw) |
76 |
return None |
77 |
|
78 |
def do_schema(self, arg): |
79 |
"""\nPrints schema information.\n"""
|
80 |
print
|
81 |
self.db.schema(arg)
|
82 |
print
|
83 |
return None |
84 |
|
85 |
def do_delimiter(self, arg): |
86 |
"""\nChange the delimiter.\n"""
|
87 |
delimiter = arg.strip() |
88 |
if len(delimiter) > 0: |
89 |
self.delimiter = delimiter
|
90 |
|
91 |
def do_q(self, arg): |
92 |
"""\nQuit.\n"""
|
93 |
return 1 |
94 |
|
95 |
def do_set(self, arg): |
96 |
"""\nSet a parameter. Some examples:\n set owner = 'informix'\n set types = ['VIEW', 'TABLE']\nThe right hand side is evaluated using `eval()`\n"""
|
97 |
d = filter(lambda x: len(x) > 0, map(lambda x: x.strip(), arg.split("="))) |
98 |
if len(d) == 1: |
99 |
if self.kw.has_key(d[0]): |
100 |
del self.kw[d[0]] |
101 |
else:
|
102 |
self.kw[d[0]] = eval(d[1]) |
103 |
|
104 |
def default(self, arg): |
105 |
try:
|
106 |
token = arg.strip() |
107 |
# is it possible the line contains the delimiter
|
108 |
if len(token) >= len(self.delimiter): |
109 |
# does the line end with the delimiter
|
110 |
if token[-1 * len(self.delimiter):] == self.delimiter: |
111 |
# now add all up to the delimiter
|
112 |
self.sqlbuffer.append(token[:-1 * len(self.delimiter)]) |
113 |
if self.sqlbuffer: |
114 |
self.db.isql(" ".join(self.sqlbuffer)) |
115 |
self.sqlbuffer = []
|
116 |
return None |
117 |
if token:
|
118 |
self.sqlbuffer.append(token)
|
119 |
except:
|
120 |
self.sqlbuffer = []
|
121 |
print sys.exc_info()[1] |
122 |
return None |
123 |
|
124 |
def emptyline(self): |
125 |
return None |
126 |
|
127 |
if __name__ == '__main__': |
128 |
import getopt |
129 |
|
130 |
try:
|
131 |
opts, args = getopt.getopt(sys.argv[1:], "b:", []) |
132 |
except getopt.error, msg:
|
133 |
print
|
134 |
print msg
|
135 |
print "Try `%s --help` for more information." % (sys.argv[0]) |
136 |
sys.exit(0)
|
137 |
|
138 |
dbname = None
|
139 |
for opt, arg in opts: |
140 |
if opt == '-b': |
141 |
dbname = arg |
142 |
|
143 |
intro = "\nisql - interactive sql (%s)\n" % (__version__)
|
144 |
|
145 |
IsqlCmd(dbname).cmdloop(intro) |