@@ -21,70 +21,41 @@ import (
21
21
"fmt"
22
22
"github.com/linuxsuren/api-testing/pkg/server"
23
23
"gorm.io/gorm"
24
+ "log"
24
25
"reflect"
25
26
"sort"
27
+ "strings"
26
28
"time"
27
29
)
28
30
29
31
func (s * dbserver ) Query (ctx context.Context , query * server.DataQuery ) (result * server.DataQueryResult , err error ) {
30
32
var db * gorm.DB
31
- if db , err = s .getClientWithDatabase (ctx , query .Key ); err != nil {
33
+ var dbQuery DataQuery
34
+ if dbQuery , err = s .getClientWithDatabase (ctx , query .Key ); err != nil {
32
35
return
33
36
}
34
37
38
+ db = dbQuery .GetClient ()
39
+
35
40
result = & server.DataQueryResult {
36
41
Data : []* server.Pair {},
37
42
Items : make ([]* server.Pairs , 0 ),
38
43
Meta : & server.DataMeta {},
39
44
}
40
45
41
46
// query database and tables
42
- var databaseResult * server.DataQueryResult
43
- if databaseResult , err = sqlQuery (ctx , queryDatabaseSql , db ); err == nil {
44
- for _ , table := range databaseResult .Items {
45
- for _ , item := range table .GetData () {
46
- if item .Key == "Database" || item .Key == "name" {
47
- var found bool
48
- for _ , name := range result .Meta .Databases {
49
- if name == item .Value {
50
- found = true
51
- }
52
- }
53
- if ! found {
54
- result .Meta .Databases = append (result .Meta .Databases , item .Value )
55
- }
56
- }
57
- }
58
- }
59
- sort .Strings (result .Meta .Databases )
47
+ if result .Meta .Databases , err = dbQuery .GetDatabases (ctx ); err != nil {
48
+ log .Printf ("failed to query databases: %v\n " , err )
60
49
}
61
50
62
- var row * sql.Row
63
- if row = db .Raw ("SELECT DATABASE() as name" ).Row (); row != nil {
64
- _ = row .Scan (& result .Meta .CurrentDatabase )
65
- } else {
66
- result .Meta .CurrentDatabase = query .Key
51
+ if result .Meta .CurrentDatabase = query .Key ; query .Key == "" {
52
+ if result .Meta .CurrentDatabase , err = dbQuery .GetCurrentDatabase (); err != nil {
53
+ log .Printf ("failed to query current database: %v\n " , err )
54
+ }
67
55
}
68
56
69
- queryTableSql := "show tables"
70
- var tableResult * server.DataQueryResult
71
- if tableResult , err = sqlQuery (ctx , queryTableSql , db ); err == nil {
72
- for _ , table := range tableResult .Items {
73
- for _ , item := range table .GetData () {
74
- if item .Key == fmt .Sprintf ("Tables_in_%s" , result .Meta .CurrentDatabase ) || item .Key == "table_name" || item .Key == "Tables" {
75
- var found bool
76
- for _ , name := range result .Meta .Tables {
77
- if name == item .Value {
78
- found = true
79
- }
80
- }
81
- if ! found {
82
- result .Meta .Tables = append (result .Meta .Tables , item .Value )
83
- }
84
- }
85
- }
86
- }
87
- sort .Strings (result .Meta .Tables )
57
+ if result .Meta .Tables , err = dbQuery .GetTables (ctx , result .Meta .CurrentDatabase ); err != nil {
58
+ log .Printf ("failed to query tables: %v\n " , err )
88
59
}
89
60
90
61
// query data
@@ -187,3 +158,89 @@ func sqlQuery(ctx context.Context, sql string, db *gorm.DB) (result *server.Data
187
158
}
188
159
189
160
const queryDatabaseSql = "show databases"
161
+
162
+ type DataQuery interface {
163
+ GetDatabases (context.Context ) (databases []string , err error )
164
+ GetTables (ctx context.Context , currentDatabase string ) (tables []string , err error )
165
+ GetCurrentDatabase () (string , error )
166
+ GetClient () * gorm.DB
167
+ }
168
+
169
+ type commonDataQuery struct {
170
+ showDatabases , showTables , currentDatabase string
171
+ db * gorm.DB
172
+ }
173
+
174
+ var _ DataQuery = & commonDataQuery {}
175
+
176
+ func NewCommonDataQuery (showDatabases , showTables , currentDatabase string , db * gorm.DB ) DataQuery {
177
+ return & commonDataQuery {
178
+ showDatabases : showDatabases ,
179
+ showTables : showTables ,
180
+ currentDatabase : currentDatabase ,
181
+ db : db ,
182
+ }
183
+ }
184
+
185
+ func (q * commonDataQuery ) GetDatabases (ctx context.Context ) (databases []string , err error ) {
186
+ var databaseResult * server.DataQueryResult
187
+ if databaseResult , err = sqlQuery (ctx , q .showDatabases , q .db ); err == nil {
188
+ for _ , table := range databaseResult .Items {
189
+ for _ , item := range table .GetData () {
190
+ if item .Key == "Database" || item .Key == "name" {
191
+ var found bool
192
+ for _ , name := range databases {
193
+ if name == item .Value {
194
+ found = true
195
+ }
196
+ }
197
+ if ! found {
198
+ databases = append (databases , item .Value )
199
+ }
200
+ }
201
+ }
202
+ }
203
+ sort .Strings (databases )
204
+ }
205
+ return
206
+ }
207
+
208
+ func (q * commonDataQuery ) GetTables (ctx context.Context , currentDatabase string ) (tables []string , err error ) {
209
+ showTables := q .showTables
210
+ if strings .Contains (showTables , "%s" ) {
211
+ showTables = fmt .Sprintf (showTables , currentDatabase )
212
+ }
213
+
214
+ var tableResult * server.DataQueryResult
215
+ if tableResult , err = sqlQuery (ctx , showTables , q .db ); err == nil {
216
+ for _ , table := range tableResult .Items {
217
+ for _ , item := range table .GetData () {
218
+ if item .Key == fmt .Sprintf ("Tables_in_%s" , currentDatabase ) || item .Key == "table_name" ||
219
+ item .Key == "Tables" || item .Key == "tablename" {
220
+ var found bool
221
+ for _ , name := range tables {
222
+ if name == item .Value {
223
+ found = true
224
+ }
225
+ }
226
+ if ! found {
227
+ tables = append (tables , item .Value )
228
+ }
229
+ }
230
+ }
231
+ }
232
+ sort .Strings (tables )
233
+ }
234
+ return
235
+ }
236
+ func (q * commonDataQuery ) GetCurrentDatabase () (current string , err error ) {
237
+ var row * sql.Row
238
+ if row = q .db .Raw (q .currentDatabase ).Row (); row != nil {
239
+ err = row .Scan (& current )
240
+ }
241
+ return
242
+ }
243
+
244
+ func (q * commonDataQuery ) GetClient () * gorm.DB {
245
+ return q .db
246
+ }
0 commit comments