@@ -24,16 +24,22 @@ import (
2424 _ "github.com/snowflakedb/gosnowflake"
2525)
2626
27- func getDatabaseHostPort (raw , defaultPort string ) (string , string , error ) {
28- beforeQuery := strings .Split (raw , "?" )[0 ]
27+ func getDatabaseHostPortExtra (raw , defaultPort string ) (string , string , string , error ) {
28+ addressAndArgs := strings .SplitN (raw , "?" , 2 )
29+ extra := ""
30+ beforeQuery := addressAndArgs [0 ]
31+ if len (addressAndArgs ) > 1 {
32+ extra = addressAndArgs [1 ]
33+ }
2934 _ , _ , err := net .SplitHostPort (beforeQuery )
3035 if err != nil && strings .HasSuffix (err .Error (), "missing port in address" ) {
3136 beforeQuery += ":" + defaultPort
3237 } else if err != nil {
33- return "" , "" , edsef ("Could not split host-port: %s" , err )
38+ return "" , "" , "" , edsef ("Could not split host-port: %s" , err )
3439 }
3540
36- return net .SplitHostPort (beforeQuery )
41+ host , port , err := net .SplitHostPort (beforeQuery )
42+ return host , port , extra , err
3743}
3844
3945func debugObject (obj interface {}) {
@@ -97,7 +103,7 @@ var defaultPorts = map[DatabaseConnectorInfoType]string{
97103
98104func getConnectionString (dbInfo DatabaseConnectorInfoDatabase ) (string , string , error ) {
99105 address := dbInfo .Address
100- split := strings .Split (address , "?" )
106+ split := strings .SplitN (address , "?" , 2 )
101107 address = split [0 ]
102108 extraArgs := ""
103109 if len (split ) > 1 {
@@ -272,16 +278,6 @@ func EvalDatabasePanel(project *ProjectState, pageIndex int, panel *PanelInfo, p
272278
273279 dbInfo := connector .Database
274280
275- vendor , connStr , err := getConnectionString (dbInfo )
276- if err != nil {
277- return err
278- }
279-
280- db , err := sqlx .Open (vendor , connStr )
281- if err != nil {
282- return err
283- }
284-
285281 mangleInsert := defaultMangleInsert
286282 qt := ansiSQLQuote
287283 if dbInfo .Type == "postgres" {
@@ -306,16 +302,11 @@ func EvalDatabasePanel(project *ProjectState, pageIndex int, panel *PanelInfo, p
306302 return err
307303 }
308304
309- // Require queries end with semicolon primarily for Oracle
310- // that blows up without this. This will still blow up if
311- // there's no semicolon and there are comments.
312- // e.g. `SELECT 1 -- flubber` -> `SELECT 1 -- flubber;`
313- //qWithoutWs := strings.TrimSpace(query)
314- //if qWithoutWs[len(qWithoutWs)-1] != ';' {
315- // query += ";"
316- //}
317-
318- server , err := getServer (project , panel .ServerId )
305+ serverId := panel .ServerId
306+ if serverId == "" {
307+ serverId = connector .ServerId
308+ }
309+ server , err := getServer (project , serverId )
319310 if err != nil {
320311 return err
321312 }
@@ -338,10 +329,9 @@ func EvalDatabasePanel(project *ProjectState, pageIndex int, panel *PanelInfo, p
338329 }
339330
340331 dbInfo .Database = tmp .Name ()
341- tmp .Close ()
342332 }
343333
344- host , port , err := getDatabaseHostPort (dbInfo .Address , defaultPorts [dbInfo .Type ])
334+ host , port , extra , err := getDatabaseHostPortExtra (dbInfo .Address , defaultPorts [dbInfo .Type ])
345335 if err != nil {
346336 return err
347337 }
@@ -360,7 +350,21 @@ func EvalDatabasePanel(project *ProjectState, pageIndex int, panel *PanelInfo, p
360350 }
361351 defer w .Close ()
362352
363- return withRemoteConnection (server , host , port , func (host , port string ) error {
353+ return withRemoteConnection (server , host , port , func (proxyHost , proxyPort string ) error {
354+ dbInfo .Address = proxyHost + ":" + proxyPort
355+ if extra != "" {
356+ dbInfo .Address += "?" + extra
357+ }
358+ vendor , connStr , err := getConnectionString (dbInfo )
359+ if err != nil {
360+ return err
361+ }
362+
363+ db , err := sqlx .Open (vendor , connStr )
364+ if err != nil {
365+ return err
366+ }
367+
364368 wroteFirstRow := false
365369 return withJSONArrayOutWriterFile (w , func (w * JSONArrayWriter ) error {
366370 _ , err := importAndRun (
@@ -377,6 +381,7 @@ func EvalDatabasePanel(project *ProjectState, pageIndex int, panel *PanelInfo, p
377381 if err != nil {
378382 return nil , err
379383 }
384+
380385 defer rows .Close ()
381386
382387 for rows .Next () {
0 commit comments