@@ -71,92 +71,87 @@ def info(self):
71
71
return 'DB: {0}, Connection: {1}@{2}:{3}' .format (
72
72
self .database , self .username , self .host , self .port )
73
73
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 ()
76
81
77
82
def cb (result ):
78
83
callback (U .getResultAsList (result ))
79
84
80
- args = self .buildArgs ('desc' )
81
- env = self .buildEnv ()
82
85
self .Command .createAndRun (args , env ,
83
- query , cb , silenceErrors = True )
84
-
85
- def getColumns (self , callback ):
86
+ query , cb ,
87
+ silenceErrors = True )
86
88
87
- def cb ( result ):
88
- callback ( U . getResultAsList ( result ) )
89
+ def getTables ( self , callback ):
90
+ self . runInternalNamedQueryCommand ( 'desc' , callback )
89
91
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 )
98
94
99
95
def getFunctions (self , callback ):
96
+ self .runInternalNamedQueryCommand ('functions' , callback )
100
97
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
103
102
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 )
112
106
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 )
117
114
env = self .buildEnv ()
118
115
self .Command .createAndRun (args , env , queryToRun , callback , timeout = self .timeout )
119
116
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
+
120
122
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 )
126
124
127
125
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 )
134
127
135
128
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
140
133
141
- stripped_queries = [
142
- queryFormat .format (query .strip ().strip (";" ))
134
+ strippedQueries = [
135
+ explainQuery .format (query .strip ().strip (";" ))
143
136
for rawQuery in queries
144
137
for query in filter (None , sqlparse .split (rawQuery ))
145
138
]
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 )
148
141
env = self .buildEnv ()
149
142
self .Command .createAndRun (args , env , queryToRun , callback , timeout = self .timeout )
150
143
151
144
def execute (self , queries , callback , stream = False ):
152
- queryToRun = ''
153
-
154
- for query in self .getOptionsForSgdbCli ()['before' ]:
155
- queryToRun += query + "\n "
145
+ queryName = 'execute'
156
146
157
147
if isinstance (queries , str ):
158
148
queries = [queries ]
159
149
150
+ # add original (umodified) queries to the history
151
+ if self .history :
152
+ self .history .add ('\n ' .join (queries ))
153
+
154
+ processedQueriesList = []
160
155
for rawQuery in queries :
161
156
for query in sqlparse .split (rawQuery ):
162
157
if self .safe_limit :
@@ -172,16 +167,58 @@ def execute(self, queries, callback, stream=False):
172
167
if (query .strip ()[- 1 :] == ';' ):
173
168
query = query .strip ()[:- 1 ]
174
169
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 ()
176
175
177
176
Log ("Query: " + queryToRun )
178
177
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 )
181
182
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 )
185
222
186
223
def buildArgs (self , queryName = None ):
187
224
cliOptions = self .getOptionsForSgdbCli ()
@@ -200,11 +237,24 @@ def buildArgs(self, queryName=None):
200
237
if formattedItem :
201
238
args = args + shlex .split (formattedItem )
202
239
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
+
203
252
# append query specific options
204
253
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
208
258
else :
209
259
# append generic options (only if not custom query)
210
260
options = cliOptions .get ('options' , None )
0 commit comments