Skip to content

Commit 8b4ff32

Browse files
committed
feat: use custom dialer for hdb database connections
When creating a new database connection to a SAP HANA database use a dialer derived from the provided dependencies.
1 parent 896ef17 commit 8b4ff32

File tree

5 files changed

+97
-30
lines changed

5 files changed

+97
-30
lines changed

go.mod

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
module github.com/influxdata/flux
22

3-
go 1.24.0
4-
5-
toolchain go1.24.2
3+
go 1.25.0
64

75
require (
86
cloud.google.com/go v0.118.0
97
cloud.google.com/go/bigtable v1.33.0
108
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.20.0
119
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.1
1210
github.com/DATA-DOG/go-sqlmock v1.4.1
13-
github.com/SAP/go-hdb v1.9.6
11+
github.com/SAP/go-hdb v1.15.2
1412
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883
1513
github.com/apache/arrow-go/v18 v18.2.0
1614
github.com/benbjohnson/immutable v0.4.3
@@ -46,7 +44,7 @@ require (
4644
github.com/vertica/vertica-sql-go v1.1.1
4745
go.uber.org/zap v1.27.0
4846
golang.org/x/exp v0.0.0-20240909161429-701f63a606c0
49-
golang.org/x/tools v0.38.0
47+
golang.org/x/tools v0.41.0
5048
gonum.org/v1/gonum v0.15.1
5149
google.golang.org/api v0.214.0
5250
google.golang.org/grpc v1.71.0
@@ -149,15 +147,15 @@ require (
149147
go.opentelemetry.io/otel/trace v1.40.0 // indirect
150148
go.uber.org/atomic v1.7.0 // indirect
151149
go.uber.org/multierr v1.10.0 // indirect
152-
golang.org/x/crypto v0.45.0 // indirect
153-
golang.org/x/mod v0.29.0 // indirect
154-
golang.org/x/net v0.47.0 // indirect
150+
golang.org/x/crypto v0.47.0 // indirect
151+
golang.org/x/mod v0.32.0 // indirect
152+
golang.org/x/net v0.49.0 // indirect
155153
golang.org/x/oauth2 v0.27.0 // indirect
156-
golang.org/x/sync v0.18.0 // indirect
154+
golang.org/x/sync v0.19.0 // indirect
157155
golang.org/x/sys v0.40.0 // indirect
158-
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 // indirect
159-
golang.org/x/term v0.37.0 // indirect
160-
golang.org/x/text v0.31.0 // indirect
156+
golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 // indirect
157+
golang.org/x/term v0.39.0 // indirect
158+
golang.org/x/text v0.34.0 // indirect
161159
golang.org/x/time v0.8.0 // indirect
162160
golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
163161
google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 // indirect

go.sum

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvK
7474
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
7575
github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
7676
github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
77-
github.com/SAP/go-hdb v1.9.6 h1:keGAgt11SnSailK5pOF8v85Ic05vEJM22stidxH6vTs=
78-
github.com/SAP/go-hdb v1.9.6/go.mod h1:eKGk33q3PZ41Lgua4lmqtKgIXpSEYs0teXePqMAcwBg=
77+
github.com/SAP/go-hdb v1.15.2 h1:IwR5GnJGfef6lVFGKy2xDLHnXtMGZAFhMC798Ce2TfM=
78+
github.com/SAP/go-hdb v1.15.2/go.mod h1:B5yJ0qHcAkBxQQorbiRxgr2dpalPVOx9zSDgXo82fvI=
7979
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
8080
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
8181
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
@@ -480,8 +480,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U
480480
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
481481
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
482482
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
483-
golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q=
484-
golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
483+
golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
484+
golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
485485
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
486486
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
487487
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -511,8 +511,8 @@ golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCc
511511
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
512512
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
513513
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
514-
golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA=
515-
golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w=
514+
golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
515+
golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
516516
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
517517
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
518518
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -530,8 +530,8 @@ golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLL
530530
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
531531
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
532532
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
533-
golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
534-
golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
533+
golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
534+
golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
535535
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
536536
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
537537
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -545,8 +545,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ
545545
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
546546
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
547547
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
548-
golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
549-
golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
548+
golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
549+
golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
550550
golang.org/x/sys v0.0.0-20180816055513-1c9583448a9c/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
551551
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
552552
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -579,19 +579,19 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
579579
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
580580
golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
581581
golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
582-
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU=
583-
golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE=
582+
golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2 h1:O1cMQHRfwNpDfDJerqRoE2oD+AFlyid87D40L/OkkJo=
583+
golang.org/x/telemetry v0.0.0-20260109210033-bd525da824e2/go.mod h1:b7fPSJ0pKZ3ccUh8gnTONJxhn3c/PS6tyzQvyqw4iA8=
584584
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
585585
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
586-
golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU=
587-
golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254=
586+
golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
587+
golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww=
588588
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
589589
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
590590
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
591591
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
592592
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
593-
golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM=
594-
golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
593+
golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk=
594+
golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA=
595595
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
596596
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
597597
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -628,8 +628,8 @@ golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapK
628628
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
629629
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
630630
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
631-
golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ=
632-
golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs=
631+
golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc=
632+
golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg=
633633
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
634634
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
635635
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

stdlib/sql/from_private_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,30 @@ func TestPostgresOpenFunctionDialer(t *testing.T) {
225225
}
226226
}
227227

228+
func TestHdbOpenFunctionDialer(t *testing.T) {
229+
expectErr := errors.New("test dial error")
230+
deps := mockDeps{
231+
Deps: flux.NewDefaultDependencies(),
232+
dialer: &mockDialer{err: expectErr},
233+
}
234+
235+
openFn := hdbOpenFunction("hdb://user:password@localhost:39013")
236+
db, err := openFn(deps)
237+
if err != nil {
238+
t.Fatalf("unexpected error from open function: %v", err)
239+
}
240+
defer db.Close()
241+
242+
// Ping triggers a real connection attempt, which will use our mock dialer.
243+
err = db.Ping()
244+
if err == nil {
245+
t.Fatal("expected error from Ping, got nil")
246+
}
247+
if !errors.Is(err, expectErr) {
248+
t.Fatalf("expected error %q, got: %v", expectErr, err)
249+
}
250+
}
251+
228252
func TestFromSqliteUrlValidation(t *testing.T) {
229253
testCases := executetest.SourceUrlValidationTestCases{
230254
{

stdlib/sql/hdb.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package sql
22

33
import (
4+
"context"
45
"database/sql"
56
"fmt"
67
"math/big"
8+
"net"
79
"strings"
810
"time"
911

1012
hdb "github.com/SAP/go-hdb/driver"
13+
"github.com/SAP/go-hdb/driver/dial"
1114
"github.com/influxdata/flux"
1215
"github.com/influxdata/flux/codes"
1316
"github.com/influxdata/flux/execute"
@@ -265,3 +268,43 @@ func hdbEscapeName(name string, toUpper bool) string {
265268
}
266269
return strings.Join(parts, ".")
267270
}
271+
272+
type hdbDialer struct {
273+
dialer flux.Dialer
274+
}
275+
276+
func (d hdbDialer) DialContext(ctx context.Context, address string, opts dial.DialerOptions) (net.Conn, error) {
277+
dialer := d.dialer
278+
if netDialer, ok := d.dialer.(*net.Dialer); ok {
279+
nd := *netDialer
280+
if opts.Timeout != time.Duration(0) {
281+
nd.Timeout = opts.Timeout
282+
}
283+
if opts.TCPKeepAlive != time.Duration(0) {
284+
nd.KeepAlive = opts.TCPKeepAlive
285+
}
286+
if opts.TCPKeepAliveConfig != (net.KeepAliveConfig{}) {
287+
nd.KeepAliveConfig = opts.TCPKeepAliveConfig
288+
}
289+
dialer = &nd
290+
}
291+
if conn, err := dialer.DialContext(ctx, "tcp4", address); err == nil {
292+
return conn, nil
293+
}
294+
return dialer.DialContext(ctx, "tcp", address)
295+
}
296+
297+
func hdbOpenFunction(dataSourceName string) openFunc {
298+
return func(deps flux.Dependencies) (*sql.DB, error) {
299+
connector, err := hdb.NewDSNConnector(dataSourceName)
300+
if err != nil {
301+
return nil, err
302+
}
303+
dialer, err := deps.Dialer()
304+
if err != nil {
305+
return nil, err
306+
}
307+
connector.SetDialer(hdbDialer{dialer})
308+
return sql.OpenDB(connector), nil
309+
}
310+
}

stdlib/sql/open.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ func defaultOpenFunction(driverName, dataSourceName string) openFunc {
3838
// against Azure AD and uses connector with access token to open DB connection.
3939
func getOpenFunc(driverName, dataSourceName string) openFunc {
4040
switch driverName {
41+
case "hdb":
42+
return hdbOpenFunction(dataSourceName)
4143
case "mssql", "sqlserver":
4244
return mssqlOpenFunction(driverName, dataSourceName)
4345
case "postgres":

0 commit comments

Comments
 (0)