Skip to content

Commit d8a7dac

Browse files
authored
Allow capability for implementing datasources to set query args (#95)
1 parent 7f3ee71 commit d8a7dac

File tree

2 files changed

+15
-3
lines changed

2 files changed

+15
-3
lines changed

datasource.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -224,11 +224,16 @@ func (ds *SQLDatasource) handleQuery(ctx context.Context, req backend.DataQuery,
224224
ctx = tctx
225225
}
226226

227+
var args []interface{}
228+
if argSetter, ok := ds.c.(QueryArgSetter); ok {
229+
args = argSetter.SetQueryArgs(ctx, headers)
230+
}
231+
227232
// FIXES:
228233
// * Some datasources (snowflake) expire connections or have an authentication token that expires if not used in 1 or 4 hours.
229234
// Because the datasource driver does not include an option for permanent connections, we retry the connection
230235
// if the query fails. NOTE: this does not include some errors like "ErrNoRows"
231-
res, err := QueryDB(ctx, dbConn.db, ds.c.Converters(), fillMode, q)
236+
res, err := QueryDB(ctx, dbConn.db, ds.c.Converters(), fillMode, q, args...)
232237
if err == nil {
233238
return res, nil
234239
}
@@ -252,7 +257,7 @@ func (ds *SQLDatasource) handleQuery(ctx context.Context, req backend.DataQuery,
252257
if ds.driverSettings.Pause > 0 {
253258
time.Sleep(time.Duration(ds.driverSettings.Pause * int(time.Second)))
254259
}
255-
res, err = QueryDB(ctx, db, ds.c.Converters(), fillMode, q)
260+
res, err = QueryDB(ctx, db, ds.c.Converters(), fillMode, q, args...)
256261
if err == nil {
257262
return res, err
258263
}
@@ -273,7 +278,7 @@ func (ds *SQLDatasource) handleQuery(ctx context.Context, req backend.DataQuery,
273278
continue
274279
}
275280

276-
res, err = QueryDB(ctx, db, ds.c.Converters(), fillMode, q)
281+
res, err = QueryDB(ctx, db, ds.c.Converters(), fillMode, q, args...)
277282
if err == nil {
278283
return res, err
279284
}

driver.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"database/sql"
66
"encoding/json"
7+
"net/http"
78
"time"
89

910
"github.com/grafana/grafana-plugin-sdk-go/backend"
@@ -47,6 +48,12 @@ type QueryMutator interface {
4748
MutateQuery(ctx context.Context, req backend.DataQuery) (context.Context, backend.DataQuery)
4849
}
4950

51+
// QueryArgSetter is an additional interface that could be implemented by driver.
52+
// This adds the ability to the driver to optionally set query args that are then sent down to the database.
53+
type QueryArgSetter interface {
54+
SetQueryArgs(ctx context.Context, headers http.Header) []interface{}
55+
}
56+
5057
// ResponseMutator is an additional interface that could be implemented by driver.
5158
// This adds ability to the driver, so it can mutate a response from the driver before its returned to the client.
5259
type ResponseMutator interface {

0 commit comments

Comments
 (0)