Skip to content
This repository was archived by the owner on Mar 12, 2020. It is now read-only.

Commit 1324fbf

Browse files
committed
Ensure "before" and "after" runs on all commands
Make sure that `before` and newly introduced `after` sql in `cli_options` settings is added to each command (if configured on top level) as well as introduce optional per command `before` and "after` which are run in addition main `before` and `after`.
1 parent 439732a commit 1324fbf

File tree

2 files changed

+121
-63
lines changed

2 files changed

+121
-63
lines changed

SQLTools.sublime-settings

+8
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
"pgsql": {
6969
"options": ["--no-password"],
7070
"before": [],
71+
"after": [],
7172
"args": "-h {host} -p {port} -U {username} -d {database}",
7273
"env_optional": {
7374
"PGPASSWORD": "{password}"
@@ -126,6 +127,7 @@
126127
"SET VERIFY OFF ",
127128
"SET WRAP OFF"
128129
],
130+
"after": [],
129131
"args": "{username}/{password}@\"(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST={host})(PORT={port})))(CONNECT_DATA=(SERVICE_NAME={service})))\"",
130132
"queries": {
131133
"desc" : {
@@ -153,6 +155,7 @@
153155
"mysql": {
154156
"options": ["-f", "--table", "--default-character-set=utf8"],
155157
"before": [],
158+
"after": [],
156159
"args": "-h{host} -P{port} -u\"{username}\" -D\"{database}\"",
157160
"args_optional": ["--login-path=\"{login-path}\"", "--defaults-extra-file=\"{defaults-extra-file}\"", "-p\"{password}\""],
158161
"queries": {
@@ -189,6 +192,7 @@
189192
"mssql": {
190193
"options": [],
191194
"before": [],
195+
"after": ["GO", "QUIT"],
192196
"args": "-d \"{database}\"",
193197
"args_optional": ["-S \"{host},{port}\"", "-S \"{host}\\{instance}\"", "-U \"{username}\"", "-P \"{password}\""],
194198
"queries": {
@@ -213,6 +217,7 @@
213217
"vertica": {
214218
"options": [],
215219
"before" : [],
220+
"after": [],
216221
"args": "-h {host} -p {port} -U \"{username}\" -w \"{password}\" -d \"{database}\"",
217222
"queries": {
218223
"desc" : {
@@ -240,6 +245,7 @@
240245
"sqsh": {
241246
"options": [],
242247
"before": ["\\set semicolon_cmd=\"\\go -mpretty -l\""],
248+
"after": [],
243249
"args": "-S {host}:{port} -U\"{username}\" -P\"{password}\" -D{database}",
244250
"queries": {
245251
"desc": {
@@ -267,6 +273,7 @@
267273
"sqlite": {
268274
"options": ["-column", "-header"],
269275
"before": [],
276+
"after": [],
270277
"args": "\"{database}\"",
271278
"queries": {
272279
"desc" : {
@@ -290,6 +297,7 @@
290297
"firebird": {
291298
"options": [],
292299
"before": [],
300+
"after": [],
293301
"args": "-u \"{username}\" -p \"{password}\" \"{host}/{port}:{database}\"",
294302
"queries": {
295303
"desc" : {

SQLToolsAPI/Connection.py

+113-63
Original file line numberDiff line numberDiff line change
@@ -71,92 +71,87 @@ def info(self):
7171
return 'DB: {0}, Connection: {1}@{2}:{3}'.format(
7272
self.database, self.username, self.host, self.port)
7373

74-
def getTables(self, callback):
75-
query = self.getOptionsForSgdbCli()['queries']['desc']['query']
74+
def runInternalNamedQueryCommand(self, queryName, callback):
75+
query = self.getNamedQuery(queryName)
76+
if not query:
77+
return
78+
79+
args = self.buildArgs(queryName)
80+
env = self.buildEnv()
7681

7782
def cb(result):
7883
callback(U.getResultAsList(result))
7984

80-
args = self.buildArgs('desc')
81-
env = self.buildEnv()
8285
self.Command.createAndRun(args, env,
83-
query, cb, silenceErrors=True)
84-
85-
def getColumns(self, callback):
86+
query, cb,
87+
silenceErrors=True)
8688

87-
def cb(result):
88-
callback(U.getResultAsList(result))
89+
def getTables(self, callback):
90+
self.runInternalNamedQueryCommand('desc', callback)
8991

90-
try:
91-
query = self.getOptionsForSgdbCli()['queries']['columns']['query']
92-
args = self.buildArgs('columns')
93-
env = self.buildEnv()
94-
self.Command.createAndRun(args, env,
95-
query, cb, silenceErrors=True)
96-
except Exception:
97-
pass
92+
def getColumns(self, callback):
93+
self.runInternalNamedQueryCommand('columns', callback)
9894

9995
def getFunctions(self, callback):
96+
self.runInternalNamedQueryCommand('functions', callback)
10097

101-
def cb(result):
102-
callback(U.getResultAsList(result))
98+
def runFormattedNamedQueryCommand(self, queryName, formatValues, callback):
99+
query = self.getNamedQuery(queryName)
100+
if not query:
101+
return
103102

104-
try:
105-
query = self.getOptionsForSgdbCli()['queries']['functions']['query']
106-
args = self.buildArgs('functions')
107-
env = self.buildEnv()
108-
self.Command.createAndRun(args, env,
109-
query, cb, silenceErrors=True)
110-
except Exception:
111-
pass
103+
# added for compatibility with older format string
104+
query = query.replace("%s", "{0}", 1)
105+
query = query.replace("%s", "{1}", 1)
112106

113-
def getTableRecords(self, tableName, callback):
114-
query = self.getOptionsForSgdbCli()['queries']['show records']['query'].format(tableName, self.rowsLimit)
115-
queryToRun = '\n'.join(self.getOptionsForSgdbCli()['before'] + [query])
116-
args = self.buildArgs('show records')
107+
if isinstance(formatValues, tuple):
108+
query = query.format(*formatValues) # unpack the tuple
109+
else:
110+
query = query.format(formatValues)
111+
112+
queryToRun = self.buildNamedQuery(queryName, query)
113+
args = self.buildArgs(queryName)
117114
env = self.buildEnv()
118115
self.Command.createAndRun(args, env, queryToRun, callback, timeout=self.timeout)
119116

117+
def getTableRecords(self, tableName, callback):
118+
# in case we expect multiple values pack them into tuple
119+
formatValues = (tableName, self.rowsLimit)
120+
self.runFormattedNamedQueryCommand('show records', formatValues, callback)
121+
120122
def getTableDescription(self, tableName, callback):
121-
query = self.getOptionsForSgdbCli()['queries']['desc table']['query'] % tableName
122-
queryToRun = '\n'.join(self.getOptionsForSgdbCli()['before'] + [query])
123-
args = self.buildArgs('desc table')
124-
env = self.buildEnv()
125-
self.Command.createAndRun(args, env, queryToRun, callback)
123+
self.runFormattedNamedQueryCommand('desc table', tableName, callback)
126124

127125
def getFunctionDescription(self, functionName, callback):
128-
query = self.getOptionsForSgdbCli()['queries']['desc function'][
129-
'query'] % functionName
130-
queryToRun = '\n'.join(self.getOptionsForSgdbCli()['before'] + [query])
131-
args = self.buildArgs('desc function')
132-
env = self.buildEnv()
133-
self.Command.createAndRun(args, env, queryToRun, callback)
126+
self.runFormattedNamedQueryCommand('desc function', functionName, callback)
134127

135128
def explainPlan(self, queries, callback):
136-
try:
137-
queryFormat = self.getOptionsForSgdbCli()['queries']['explain plan']['query']
138-
except KeyError:
139-
return # do nothing, if DBMS has no support for explain plan
129+
queryName = 'explain plan'
130+
explainQuery = self.getNamedQuery(queryName)
131+
if not explainQuery:
132+
return
140133

141-
stripped_queries = [
142-
queryFormat.format(query.strip().strip(";"))
134+
strippedQueries = [
135+
explainQuery.format(query.strip().strip(";"))
143136
for rawQuery in queries
144137
for query in filter(None, sqlparse.split(rawQuery))
145138
]
146-
queryToRun = '\n'.join(self.getOptionsForSgdbCli()['before'] + stripped_queries)
147-
args = self.buildArgs('explain plan')
139+
queryToRun = self.buildNamedQuery(queryName, strippedQueries)
140+
args = self.buildArgs(queryName)
148141
env = self.buildEnv()
149142
self.Command.createAndRun(args, env, queryToRun, callback, timeout=self.timeout)
150143

151144
def execute(self, queries, callback, stream=False):
152-
queryToRun = ''
153-
154-
for query in self.getOptionsForSgdbCli()['before']:
155-
queryToRun += query + "\n"
145+
queryName = 'execute'
156146

157147
if isinstance(queries, str):
158148
queries = [queries]
159149

150+
# add original (umodified) queries to the history
151+
if self.history:
152+
self.history.add('\n'.join(queries))
153+
154+
processedQueriesList = []
160155
for rawQuery in queries:
161156
for query in sqlparse.split(rawQuery):
162157
if self.safe_limit:
@@ -172,16 +167,58 @@ def execute(self, queries, callback, stream=False):
172167
if (query.strip()[-1:] == ';'):
173168
query = query.strip()[:-1]
174169
query += " LIMIT {0};".format(self.safe_limit)
175-
queryToRun += query + "\n"
170+
processedQueriesList.append(query)
171+
172+
queryToRun = self.buildNamedQuery(queryName, processedQueriesList)
173+
args = self.buildArgs(queryName)
174+
env = self.buildEnv()
176175

177176
Log("Query: " + queryToRun)
178177

179-
if self.history:
180-
self.history.add(queryToRun)
178+
self.Command.createAndRun(args, env, queryToRun, callback,
179+
options={'show_query': self.show_query},
180+
timeout=self.timeout,
181+
stream=stream)
181182

182-
args = self.buildArgs()
183-
env = self.buildEnv()
184-
self.Command.createAndRun(args, env, queryToRun, callback, options={'show_query': self.show_query}, timeout=self.timeout, stream=stream)
183+
def getNamedQuery(self, queryName):
184+
if not queryName:
185+
return None
186+
187+
cliOptions = self.getOptionsForSgdbCli()
188+
return cliOptions.get('queries', {}).get(queryName, {}).get('query')
189+
190+
def buildNamedQuery(self, queryName, queries):
191+
if not queryName:
192+
return None
193+
194+
if not queries:
195+
return None
196+
197+
cliOptions = self.getOptionsForSgdbCli()
198+
beforeCli = cliOptions.get('before')
199+
beforeQuery = cliOptions.get('queries', {}).get(queryName, {}).get('before')
200+
afterCli = cliOptions.get('after')
201+
afterQuery = cliOptions.get('queries', {}).get(queryName, {}).get('after')
202+
203+
# sometimes we preprocess the raw queries from user, in that case we already have a list
204+
if type(queries) is not list:
205+
queries = [queries]
206+
207+
builtQueries = []
208+
if beforeCli is not None:
209+
builtQueries.extend(beforeCli)
210+
if beforeQuery is not None:
211+
builtQueries.extend(beforeQuery)
212+
if queries is not None:
213+
builtQueries.extend(queries)
214+
if afterCli is not None:
215+
builtQueries.extend(afterCli)
216+
if afterQuery is not None:
217+
builtQueries.extend(afterQuery)
218+
219+
print(builtQueries)
220+
221+
return '\n'.join(builtQueries)
185222

186223
def buildArgs(self, queryName=None):
187224
cliOptions = self.getOptionsForSgdbCli()
@@ -200,11 +237,24 @@ def buildArgs(self, queryName=None):
200237
if formattedItem:
201238
args = args + shlex.split(formattedItem)
202239

240+
# append generic options
241+
# options = cliOptions.get('options', None)
242+
# if options:
243+
# args = args + options
244+
245+
# append query specific options (if present)
246+
# if queryName:
247+
# queryOptions = cliOptions.get('queries', {}).get(queryName, {}).get.('options')
248+
# if queryOptions:
249+
# if len(queryOptions) > 0:
250+
# args = args + queryOptions
251+
203252
# append query specific options
204253
if queryName:
205-
queryOptions = cliOptions['queries'][queryName]['options']
206-
if len(queryOptions) > 0:
207-
args = args + queryOptions
254+
queryOptions = cliOptions.get('queries', {}).get(queryName, {}).get('options')
255+
if queryOptions:
256+
if len(queryOptions) > 0:
257+
args = args + queryOptions
208258
else:
209259
# append generic options (only if not custom query)
210260
options = cliOptions.get('options', None)

0 commit comments

Comments
 (0)