Skip to content

Commit 7cd5634

Browse files
committed
release 0.109.0
1 parent 100a850 commit 7cd5634

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+976
-1424
lines changed

.drone.yml

Lines changed: 0 additions & 24 deletions
This file was deleted.

.drone.yml.license

Lines changed: 0 additions & 3 deletions
This file was deleted.

.github/workflows/build.yml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ jobs:
88

99
steps:
1010

11-
- uses: actions/checkout@v2
11+
- uses: actions/checkout@v3
1212

1313
- name: Setup go
14-
uses: actions/setup-go@v2
14+
uses: actions/setup-go@v3
1515
with:
1616
go-version: '1.19'
1717

@@ -25,7 +25,7 @@ jobs:
2525
matrix:
2626
goos: [linux]
2727
goarch: [amd64, arm, arm64, s390x]
28-
go: [ '1.19', '1.18', '1.17' ]
28+
go: ['1.19', '1.18']
2929
fail-fast: false
3030

3131
name: Go ${{ matrix.go }} ${{ matrix.goos }} ${{ matrix.goarch }} build
@@ -42,10 +42,10 @@ jobs:
4242
sudo apt-get update
4343
sudo apt-get -y install qemu-user
4444
45-
- uses: actions/checkout@v2
45+
- uses: actions/checkout@v3
4646

4747
- name: Setup go
48-
uses: actions/setup-go@v2
48+
uses: actions/setup-go@v3
4949
with:
5050
go-version: ${{ matrix.go }}
5151

@@ -69,17 +69,17 @@ jobs:
6969
runs-on: macos-latest
7070
strategy:
7171
matrix:
72-
go: [ '1.19', '1.18', '1.17' ]
72+
go: ['1.19', '1.18']
7373
fail-fast: false
7474

7575
name: Go ${{ matrix.go }} macOS
7676

7777
steps:
7878

79-
- uses: actions/checkout@v2
79+
- uses: actions/checkout@v3
8080

8181
- name: Setup go
82-
uses: actions/setup-go@v2
82+
uses: actions/setup-go@v3
8383
with:
8484
go-version: ${{ matrix.go }}
8585

@@ -103,17 +103,17 @@ jobs:
103103
runs-on: windows-latest
104104
strategy:
105105
matrix:
106-
go: [ '1.19', '1.18', '1.17' ]
106+
go: ['1.19', '1.18']
107107
fail-fast: false
108108

109109
name: Go ${{ matrix.go }} Windows
110110

111111
steps:
112112

113-
- uses: actions/checkout@v2
113+
- uses: actions/checkout@v3
114114

115115
- name: Setup go
116-
uses: actions/setup-go@v2
116+
uses: actions/setup-go@v3
117117
with:
118118
go-version: ${{ matrix.go }}
119119

.github/workflows/reuse.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ jobs:
66
test:
77
runs-on: ubuntu-latest
88
steps:
9-
- uses: actions/checkout@v2
9+
- uses: actions/checkout@v3
1010
- name: REUSE Compliance Check
1111
uses: fsfe/[email protected]

Makefile

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,7 @@ all:
1515
@echo execute tests on latest go version
1616
go test ./...
1717
@echo execute tests on older supported go versions
18-
go1.17.13 test ./...
19-
go1.18.5 test ./...
18+
go1.18.7 test ./...
2019
@echo "reuse (license) check"
2120
reuse lint
2221

@@ -31,10 +30,8 @@ tools:
3130

3231
#install additional go versions
3332
go:
34-
go install golang.org/dl/go1.17.13@latest
35-
go1.17.13 download
36-
go install golang.org/dl/go1.18.5@latest
37-
go1.18.5 download
33+
go install golang.org/dl/go1.18.7@latest
34+
go1.18.7 download
3835

3936
#install fsfe reuse tool (https://git.fsfe.org/reuse/tool)
4037
# pre-conditions:

RELEASENOTES.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
Release Notes
22
=============
33

4+
## Release 0.109
5+
6+
#### Release Notes
7+
8+
- Moved prometheus collector from ./driver/prometheus to ./prometheus (incompatible change)
9+
- Removed deprecated /driver/hdb package
10+
- Dropped support of Go language versions < Go 1.18
11+
- Added bulk function execute (experimental - please see Example_fctInsert())
12+
- Upgraded dependencies (see go.mod)
13+
414
## Release 0.108
515

616
Release 0.108.3 (upgrade urgency: low)

driver/args.go

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
// SPDX-FileCopyrightText: 2014-2022 SAP SE
2+
//
3+
// SPDX-License-Identifier: Apache-2.0
4+
5+
package driver
6+
7+
import (
8+
"database/sql"
9+
"database/sql/driver"
10+
"errors"
11+
"fmt"
12+
"reflect"
13+
)
14+
15+
// ErrEndOfRows is the error to be returned using a function based bulk exec to indicate
16+
// the end of rows.
17+
var ErrEndOfRows = errors.New("end of rows")
18+
19+
type argsScanner interface {
20+
scan(nvargs []driver.NamedValue) error
21+
}
22+
23+
type singleArgs struct {
24+
i int
25+
nvargs []driver.NamedValue
26+
}
27+
28+
func (it *singleArgs) scan(nvargs []driver.NamedValue) error {
29+
if it.i != 0 {
30+
return ErrEndOfRows
31+
}
32+
copy(nvargs, it.nvargs)
33+
it.i++
34+
return nil
35+
}
36+
37+
type multiArgs struct {
38+
i int
39+
nvargs []driver.NamedValue
40+
}
41+
42+
func (it *multiArgs) scan(nvargs []driver.NamedValue) error {
43+
if it.i >= len(it.nvargs) {
44+
return ErrEndOfRows
45+
}
46+
n := copy(nvargs, it.nvargs[it.i:])
47+
it.i += n
48+
return nil
49+
}
50+
51+
type fctArgs struct {
52+
init bool
53+
fct func(args []any) error
54+
args []any
55+
}
56+
57+
func (it *fctArgs) scan(nvargs []driver.NamedValue) error {
58+
if !it.init {
59+
it.args = make([]any, len(nvargs))
60+
it.init = false
61+
}
62+
err := it.fct(it.args)
63+
if err != nil {
64+
return err
65+
}
66+
for i := 0; i < len(nvargs); i++ {
67+
nvargs[i] = convertToNamedValue(i, it.args[i])
68+
}
69+
return nil
70+
}
71+
72+
func convertToNamedValue(idx int, arg any) driver.NamedValue {
73+
switch t := arg.(type) {
74+
case sql.NamedArg:
75+
return driver.NamedValue{Name: t.Name, Ordinal: idx + 1, Value: t.Value}
76+
default:
77+
return driver.NamedValue{Ordinal: idx + 1, Value: arg}
78+
}
79+
}
80+
81+
type anyListArgs struct {
82+
i int
83+
list []any
84+
}
85+
86+
func (it *anyListArgs) scan(nvargs []driver.NamedValue) error {
87+
if it.i >= len(it.list) {
88+
return ErrEndOfRows
89+
}
90+
nvargs[0] = convertToNamedValue(0, it.list[it.i])
91+
it.i++
92+
return nil
93+
}
94+
95+
type anyTableArgs struct {
96+
i int
97+
table [][]any
98+
}
99+
100+
func (it *anyTableArgs) scan(nvargs []driver.NamedValue) error {
101+
if it.i >= len(it.table) {
102+
return ErrEndOfRows
103+
}
104+
for j := 0; j < len(nvargs); j++ {
105+
nvargs[j] = convertToNamedValue(j, it.table[it.i][j])
106+
}
107+
it.i++
108+
return nil
109+
}
110+
111+
type genListArgs struct {
112+
i int
113+
list reflect.Value
114+
}
115+
116+
func (it *genListArgs) scan(nvargs []driver.NamedValue) error {
117+
if it.i >= it.list.Len() {
118+
return ErrEndOfRows
119+
}
120+
nvargs[0] = convertToNamedValue(0, it.list.Index(it.i).Interface())
121+
it.i++
122+
return nil
123+
}
124+
125+
type genTableArgs struct {
126+
i int
127+
table reflect.Value
128+
}
129+
130+
func (it *genTableArgs) scan(nvargs []driver.NamedValue) error {
131+
if it.i >= it.table.Len() {
132+
return ErrEndOfRows
133+
}
134+
list := it.table.Index(it.i)
135+
for j := 0; j < len(nvargs); j++ {
136+
nvargs[j] = convertToNamedValue(j, list.Index(j).Interface())
137+
}
138+
it.i++
139+
return nil
140+
}
141+
142+
func isList(v any) (any, bool) {
143+
rv := reflect.ValueOf(v)
144+
switch rv.Kind() {
145+
case reflect.Array, reflect.Slice:
146+
// but do not allow slice, array of bytes
147+
if rv.Type().Elem().Kind() == reflect.Uint8 {
148+
return nil, false
149+
}
150+
return rv.Interface(), true
151+
case reflect.Ptr:
152+
return isList(rv.Elem().Interface())
153+
default:
154+
return nil, false
155+
}
156+
}
157+
158+
func isTable(v any) (any, bool) {
159+
rv := reflect.ValueOf(v)
160+
switch rv.Kind() {
161+
case reflect.Array, reflect.Slice:
162+
if list, ok := isList(rv.Elem().Interface()); ok {
163+
return list, true
164+
}
165+
return nil, false
166+
case reflect.Ptr:
167+
return isTable(rv.Elem().Interface())
168+
default:
169+
return nil, false
170+
}
171+
}
172+
173+
type argsMismatchError struct {
174+
numArg int
175+
numPrm int
176+
}
177+
178+
func newArgsMismatchError(numArg, numPrm int) *argsMismatchError {
179+
return &argsMismatchError{numArg: numArg, numPrm: numPrm}
180+
}
181+
182+
func (e *argsMismatchError) Error() string {
183+
return fmt.Sprintf("argument parameter mismatch - number of arguments %d number of parameters %d", e.numArg, e.numPrm)
184+
}
185+
186+
func newArgsScanner(numField int, nvargs []driver.NamedValue) (argsScanner, error) {
187+
numArg := len(nvargs)
188+
189+
switch numArg {
190+
191+
case 0:
192+
if numField == 0 {
193+
return nil, nil
194+
}
195+
return nil, newArgsMismatchError(numArg, numField)
196+
197+
case 1:
198+
arg := nvargs[0].Value
199+
200+
switch numField {
201+
case 0:
202+
return nil, newArgsMismatchError(numArg, numField)
203+
case 1:
204+
if v, ok := arg.(func(args []any) error); ok {
205+
return &fctArgs{fct: v}, nil
206+
}
207+
if v, ok := arg.([]any); ok {
208+
return &anyListArgs{list: v}, nil
209+
}
210+
if v, ok := isList(arg); ok {
211+
return &genListArgs{list: reflect.ValueOf(v)}, nil
212+
}
213+
return &singleArgs{nvargs: nvargs}, nil
214+
default:
215+
if v, ok := arg.(func(args []any) error); ok {
216+
return &fctArgs{fct: v}, nil
217+
}
218+
if v, ok := arg.([][]any); ok {
219+
return &anyTableArgs{table: v}, nil
220+
}
221+
if v, ok := isTable(arg); ok {
222+
return &genTableArgs{table: reflect.ValueOf(v)}, nil
223+
}
224+
return nil, fmt.Errorf("invalid argument type %T", arg)
225+
}
226+
227+
default:
228+
if numField == 0 {
229+
return nil, newArgsMismatchError(numArg, numField)
230+
}
231+
switch {
232+
case numArg == numField:
233+
return &singleArgs{nvargs: nvargs}, nil
234+
case numArg%numField == 0:
235+
return &multiArgs{nvargs: nvargs}, nil
236+
default:
237+
return nil, newArgsMismatchError(numArg, numField)
238+
}
239+
}
240+
}

0 commit comments

Comments
 (0)