Skip to content

Commit f35dc61

Browse files
authored
Query errors (#92)
return errors from query
1 parent 29ba2a5 commit f35dc61

File tree

5 files changed

+72
-4
lines changed

5 files changed

+72
-4
lines changed

.drone.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ services:
1818

1919
steps:
2020
- name: "test"
21-
image: golang:1.19
21+
image: golang:1.20
2222
commands:
2323
- go test ./...
2424
- name: "integraiton_tests"
25-
image: golang:1.19
25+
image: golang:1.20
2626
environment:
2727
INTEGRATION_TESTS: "true"
2828
MYSQL_URL: "mysql:mysql@tcp(mysql:3306)/mysql"

datasource.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,13 @@ func (ds *SQLDatasource) QueryData(ctx context.Context, req *backend.QueryDataRe
142142
}
143143

144144
wg.Wait()
145-
return response.Response(), nil
146145

146+
errs := ds.errors(response)
147+
if ds.driverSettings.Errors {
148+
return response.Response(), errs
149+
}
150+
151+
return response.Response(), nil
147152
}
148153

149154
func (ds *SQLDatasource) GetDBFromQuery(q *Query, datasourceUID string) (*sql.DB, error) {
@@ -380,3 +385,21 @@ func shouldRetry(retryOn []string, err string) bool {
380385
}
381386
return false
382387
}
388+
389+
func (ds *SQLDatasource) errors(response *Response) error {
390+
if response == nil {
391+
return nil
392+
}
393+
res := response.Response()
394+
if res == nil {
395+
return nil
396+
}
397+
var err error
398+
for _, r := range res.Responses {
399+
err = errors.Join(err, r.Error)
400+
}
401+
if err != nil {
402+
backend.Logger.Error(err.Error())
403+
}
404+
return err
405+
}

datasource_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,46 @@ func Test_check_health_with_headers(t *testing.T) {
353353
assert.Contains(t, string(message), "bar")
354354
}
355355

356+
func Test_no_errors(t *testing.T) {
357+
dsUID := "pass"
358+
settings := backend.DataSourceInstanceSettings{UID: dsUID}
359+
360+
handler := &testSqlHandler{pass: true}
361+
mockDriver := "no-errors"
362+
mock.RegisterDriver(mockDriver, handler)
363+
db, err := sql.Open(mockDriver, "")
364+
if err != nil {
365+
t.Errorf("failed to connect to mock driver: %v", err)
366+
}
367+
driver := fakeDriver{
368+
openDBfn: func(msg json.RawMessage) (*sql.DB, error) {
369+
db, err := sql.Open(mockDriver, "")
370+
if err != nil {
371+
t.Errorf("failed to connect to mock driver: %v", err)
372+
}
373+
return db, nil
374+
},
375+
}
376+
max := time.Duration(10) * time.Second
377+
driverSettings := DriverSettings{Retries: 1, Timeout: max, RetryOn: []string{""}, Errors: true}
378+
ds := &SQLDatasource{c: driver, driverSettings: driverSettings}
379+
380+
key := defaultKey(dsUID)
381+
// Add the mandatory default db
382+
ds.storeDBConnection(key, dbConnection{db, settings})
383+
ctx := context.Background()
384+
req := &backend.CheckHealthRequest{
385+
PluginContext: backend.PluginContext{
386+
DataSourceInstanceSettings: &settings,
387+
},
388+
}
389+
result, err := ds.CheckHealth(ctx, req)
390+
391+
assert.Nil(t, err)
392+
expected := "Data source is working"
393+
assert.Equal(t, expected, result.Message)
394+
}
395+
356396
var testCounter = 0
357397
var testTimeout = 1
358398
var testRows = 0
@@ -362,10 +402,14 @@ type testSqlHandler struct {
362402
error
363403
ping bool
364404
checks int
405+
pass bool
365406
}
366407

367408
func (s *testSqlHandler) Ping(ctx context.Context) error {
368409
s.checks += 1
410+
if s.pass {
411+
return nil
412+
}
369413
if s.error != nil {
370414
return s.error
371415
}

driver.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type DriverSettings struct {
1818
Pause int
1919
RetryOn []string
2020
ForwardHeaders bool
21+
Errors bool
2122
}
2223

2324
// Driver is a simple interface that defines how to connect to a backend SQL datasource

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module github.com/grafana/sqlds/v2
22

3-
go 1.19
3+
go 1.20
44

55
require (
66
github.com/go-sql-driver/mysql v1.4.0

0 commit comments

Comments
 (0)