Skip to content

Commit 85e22fd

Browse files
authored
Fix for remote connections in Go runner (#134)
* Fix remote db open * Update arch * Fix for remote db connection * Fix for fmt * Fix for tests
1 parent f8331c8 commit 85e22fd

File tree

4 files changed

+63
-34
lines changed

4 files changed

+63
-34
lines changed

ARCHITECTURE.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@ something to install all missing dependencies.
3333

3434
### ./desktop/panel
3535

36+
NOTE: This code is being migrated to Go. All panel types except for a
37+
few database vendors have been ported to Go. A number of Node panel
38+
handlers have been deleted since they are no longer used.
39+
3640
This is where eval handlers for each panel type (program, database,
3741
etc.) are defined.
3842

@@ -45,6 +49,10 @@ this on desktop. ./server/runner.ts is the equivalent on the server.
4549

4650
This allows easy resource cleanup and easy "kill" panel eval support.
4751

52+
## ./runner
53+
54+
This is where the Go port of the original Node.js panel eval code is.
55+
4856
## ./server
4957

5058
This directory contains the server (Express) app and code that proxies

runner/database.go

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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

3945
func debugObject(obj interface{}) {
@@ -97,7 +103,7 @@ var defaultPorts = map[DatabaseConnectorInfoType]string{
97103

98104
func 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() {

runner/database_test.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ func Test_getConnectionString(t *testing.T) {
1414
expErr error
1515
expHost string
1616
expPort string
17+
expExtra string
1718
}{
1819
{
1920
DatabaseConnectorInfoDatabase{Type: "postgres", Username: "jim", Password: Encrypt{Encrypted: false, Value: "pw"}, Database: "test", Address: "localhost?sslmode=disable"},
@@ -22,6 +23,7 @@ func Test_getConnectionString(t *testing.T) {
2223
nil,
2324
"localhost",
2425
"5432",
26+
"sslmode=disable",
2527
},
2628
{
2729
DatabaseConnectorInfoDatabase{Type: "postgres", Database: "test", Address: "big.com:8888?sslmode=disable"},
@@ -30,6 +32,7 @@ func Test_getConnectionString(t *testing.T) {
3032
nil,
3133
"big.com",
3234
"8888",
35+
"sslmode=disable",
3336
},
3437
{
3538
DatabaseConnectorInfoDatabase{Type: "mysql", Username: "jim", Password: Encrypt{Encrypted: false, Value: "pw"}, Database: "test", Address: "localhost:9090"},
@@ -38,6 +41,7 @@ func Test_getConnectionString(t *testing.T) {
3841
nil,
3942
"localhost",
4043
"9090",
44+
"",
4145
},
4246
{
4347
DatabaseConnectorInfoDatabase{Type: "sqlite", Database: "test.sql"},
@@ -46,6 +50,7 @@ func Test_getConnectionString(t *testing.T) {
4650
nil,
4751
"",
4852
"",
53+
"",
4954
},
5055
{
5156
DatabaseConnectorInfoDatabase{Type: "oracle", Username: "jim", Password: Encrypt{Encrypted: false, Value: "pw"}, Database: "test", Address: "localhost"},
@@ -54,6 +59,7 @@ func Test_getConnectionString(t *testing.T) {
5459
nil,
5560
"localhost",
5661
"1521",
62+
"",
5763
},
5864
{
5965
DatabaseConnectorInfoDatabase{Type: "snowflake", Username: "jim", Password: Encrypt{Encrypted: false, Value: ""}, Database: "test", Address: "myid"},
@@ -62,6 +68,7 @@ func Test_getConnectionString(t *testing.T) {
6268
nil,
6369
"",
6470
"",
71+
"",
6572
},
6673
{
6774
DatabaseConnectorInfoDatabase{Type: "snowflake", Username: "jim", Password: Encrypt{Encrypted: false, Value: "pw"}, Database: "test", Address: "myid?x=y"},
@@ -70,6 +77,7 @@ func Test_getConnectionString(t *testing.T) {
7077
nil,
7178
"",
7279
"",
80+
"x=y",
7381
},
7482
{
7583
DatabaseConnectorInfoDatabase{Type: "sqlserver", Username: "jim", Password: Encrypt{Encrypted: false, Value: "pw"}, Database: "test", Address: "localhost"},
@@ -78,6 +86,7 @@ func Test_getConnectionString(t *testing.T) {
7886
nil,
7987
"localhost",
8088
"1433",
89+
"",
8190
},
8291
{
8392
DatabaseConnectorInfoDatabase{Type: "clickhouse", Username: "jim", Password: Encrypt{Encrypted: false, Value: "pw"}, Database: "test", Address: "localhost"},
@@ -86,6 +95,7 @@ func Test_getConnectionString(t *testing.T) {
8695
nil,
8796
"localhost",
8897
"9000",
98+
"",
8999
},
90100
{
91101
DatabaseConnectorInfoDatabase{Type: "clickhouse", Password: Encrypt{Encrypted: false, Value: ""}, Database: "test", Address: "localhost:9001"},
@@ -94,6 +104,7 @@ func Test_getConnectionString(t *testing.T) {
94104
nil,
95105
"localhost",
96106
"9001",
107+
"",
97108
},
98109
}
99110
for _, test := range tests {
@@ -106,9 +117,10 @@ func Test_getConnectionString(t *testing.T) {
106117
continue
107118
}
108119

109-
host, port, err := getDatabaseHostPort(test.conn.Address, defaultPorts[DatabaseConnectorInfoType(test.expVendor)])
120+
host, port, extra, err := getDatabaseHostPortExtra(test.conn.Address, defaultPorts[DatabaseConnectorInfoType(test.expVendor)])
110121
assert.Nil(t, err)
111122
assert.Equal(t, test.expHost, host)
112123
assert.Equal(t, test.expPort, port)
124+
assert.Equal(t, test.expExtra, extra)
113125
}
114126
}

runner/ssh.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,17 @@ func withRemoteConnection(si *ServerInfo, host, port string, cb func(host, port
254254
localPort := localConn.Addr().(*net.TCPAddr).Port
255255
cbErr := cb("localhost", fmt.Sprintf("%d", localPort))
256256
if cbErr != nil {
257-
return err
257+
return cbErr
258258
}
259259

260-
err = <-errC
261-
if err == io.EOF {
260+
select {
261+
case err = <-errC:
262+
if err == io.EOF {
263+
return nil
264+
}
265+
266+
return err
267+
default:
262268
return nil
263269
}
264-
265-
return err
266270
}

0 commit comments

Comments
 (0)