Remove native/transactional BulkSet/BulkDelete from state stores (#2834)

Signed-off-by: ItalyPaleAle <43508+ItalyPaleAle@users.noreply.github.com>
This commit is contained in:
Alessandro (Ale) Segala 2023-05-17 14:56:34 -07:00 committed by GitHub
parent d2cad27b3f
commit e30d140479
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
44 changed files with 492 additions and 1548 deletions

View File

@ -7,16 +7,16 @@ require (
github.com/invopop/jsonschema v0.6.0 github.com/invopop/jsonschema v0.6.0
github.com/spf13/cobra v1.6.1 github.com/spf13/cobra v1.6.1
github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5 github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc
sigs.k8s.io/yaml v1.3.0 sigs.k8s.io/yaml v1.3.0
) )
require ( require (
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce // indirect github.com/dapr/kit v0.0.5 // indirect
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect
github.com/inconshreveable/mousetrap v1.0.1 // indirect github.com/inconshreveable/mousetrap v1.0.1 // indirect
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect
github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect

View File

@ -1,10 +1,10 @@
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce h1:Izd5gVwKZ9Gn01nXOENaM1sJRsmJFK7JO+OfHWeOh2M= github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg=
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk=
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
@ -12,16 +12,16 @@ github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7P
github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/invopop/jsonschema v0.6.0 h1:8e+xY8ZEn8gDHUYylSlLHy22P+SLeIRIHv3nM3hCbmY= github.com/invopop/jsonschema v0.6.0 h1:8e+xY8ZEn8gDHUYylSlLHy22P+SLeIRIHv3nM3hCbmY=
github.com/invopop/jsonschema v0.6.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= github.com/invopop/jsonschema v0.6.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY=
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
@ -37,8 +37,8 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5 h1:ImnGIsrcG8vwbovhYvvSY8fagVV6QhCWSWXfzwGDLVs= github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5 h1:ImnGIsrcG8vwbovhYvvSY8fagVV6QhCWSWXfzwGDLVs=
github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xeipuuv/gojsonschema v1.2.1-0.20201027075954-b076d39a02e5/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=

View File

@ -38,8 +38,7 @@ func (z *ZeebeCommand) deployProcess(ctx context.Context, req *bindings.InvokeRe
return nil, ErrMissingFileName return nil, ErrMissingFileName
} }
// TODO: Replace with a method that is not deprecated. response, err := z.client.NewDeployResourceCommand().
response, err := z.client.NewDeployProcessCommand(). //nolint:staticcheck
AddResource(req.Data, deployFileName). AddResource(req.Data, deployFileName).
Send(ctx) Send(ctx)
if err != nil { if err != nil {

36
go.mod
View File

@ -39,7 +39,7 @@ require (
github.com/apache/rocketmq-client-go/v2 v2.1.2-0.20230412142645-25003f6f083d github.com/apache/rocketmq-client-go/v2 v2.1.2-0.20230412142645-25003f6f083d
github.com/apache/thrift v0.13.0 github.com/apache/thrift v0.13.0
github.com/aws/aws-sdk-go v1.44.214 github.com/aws/aws-sdk-go v1.44.214
github.com/benbjohnson/clock v1.3.0 github.com/benbjohnson/clock v1.3.4
github.com/bradfitz/gomemcache v0.0.0-20230124162541-5f7a7d875746 github.com/bradfitz/gomemcache v0.0.0-20230124162541-5f7a7d875746
github.com/camunda/zeebe/clients/go/v8 v8.1.8 github.com/camunda/zeebe/clients/go/v8 v8.1.8
github.com/cenkalti/backoff/v4 v4.2.1 github.com/cenkalti/backoff/v4 v4.2.1
@ -51,13 +51,13 @@ require (
github.com/cloudwego/kitex-examples v0.1.1 github.com/cloudwego/kitex-examples v0.1.1
github.com/cyphar/filepath-securejoin v0.2.3 github.com/cyphar/filepath-securejoin v0.2.3
github.com/dancannon/gorethink v4.0.0+incompatible github.com/dancannon/gorethink v4.0.0+incompatible
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce github.com/dapr/kit v0.0.5
github.com/didip/tollbooth/v7 v7.0.1 github.com/didip/tollbooth/v7 v7.0.1
github.com/eclipse/paho.mqtt.golang v1.4.2 github.com/eclipse/paho.mqtt.golang v1.4.2
github.com/fasthttp-contrib/sessions v0.0.0-20160905201309-74f6ac73d5d5 github.com/fasthttp-contrib/sessions v0.0.0-20160905201309-74f6ac73d5d5
github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32
github.com/go-redis/redis/v8 v8.11.5 github.com/go-redis/redis/v8 v8.11.5
github.com/go-sql-driver/mysql v1.7.0 github.com/go-sql-driver/mysql v1.7.1
github.com/go-zookeeper/zk v1.0.3 github.com/go-zookeeper/zk v1.0.3
github.com/gocql/gocql v1.3.1 github.com/gocql/gocql v1.3.1
github.com/golang/mock v1.6.0 github.com/golang/mock v1.6.0
@ -67,7 +67,6 @@ require (
github.com/grandcat/zeroconf v1.0.0 github.com/grandcat/zeroconf v1.0.0
github.com/hamba/avro/v2 v2.5.0 github.com/hamba/avro/v2 v2.5.0
github.com/hashicorp/consul/api v1.13.0 github.com/hashicorp/consul/api v1.13.0
github.com/hashicorp/go-multierror v1.1.1
github.com/hashicorp/golang-lru/v2 v2.0.2 github.com/hashicorp/golang-lru/v2 v2.0.2
github.com/hazelcast/hazelcast-go-client v0.0.0-20190530123621-6cf767c2f31a github.com/hazelcast/hazelcast-go-client v0.0.0-20190530123621-6cf767c2f31a
github.com/http-wasm/http-wasm-host-go v0.4.2 github.com/http-wasm/http-wasm-host-go v0.4.2
@ -97,14 +96,14 @@ require (
github.com/rabbitmq/amqp091-go v1.7.0 github.com/rabbitmq/amqp091-go v1.7.0
github.com/redis/go-redis/v9 v9.0.3 github.com/redis/go-redis/v9 v9.0.3
github.com/sendgrid/sendgrid-go v3.12.0+incompatible github.com/sendgrid/sendgrid-go v3.12.0+incompatible
github.com/sijms/go-ora/v2 v2.6.11 github.com/sijms/go-ora/v2 v2.7.6
github.com/spf13/cast v1.5.0 github.com/spf13/cast v1.5.1
github.com/stretchr/testify v1.8.2 github.com/stretchr/testify v1.8.2
github.com/supplyon/gremcos v0.1.40 github.com/supplyon/gremcos v0.1.40
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.608 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.608
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssm v1.0.608 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssm v1.0.608
github.com/tetratelabs/wazero v1.1.0 github.com/tetratelabs/wazero v1.1.0
github.com/valyala/fasthttp v1.45.0 github.com/valyala/fasthttp v1.47.0
github.com/vmware/vmware-go-kcl v1.5.0 github.com/vmware/vmware-go-kcl v1.5.0
github.com/xdg-go/scram v1.1.2 github.com/xdg-go/scram v1.1.2
go.etcd.io/etcd/client/v3 v3.5.5 go.etcd.io/etcd/client/v3 v3.5.5
@ -113,11 +112,11 @@ require (
go.temporal.io/sdk v1.21.1 go.temporal.io/sdk v1.21.1
go.uber.org/multierr v1.11.0 go.uber.org/multierr v1.11.0
go.uber.org/ratelimit v0.2.0 go.uber.org/ratelimit v0.2.0
golang.org/x/crypto v0.8.0 golang.org/x/crypto v0.9.0
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc
golang.org/x/mod v0.10.0 golang.org/x/mod v0.10.0
golang.org/x/net v0.9.0 golang.org/x/net v0.10.0
golang.org/x/oauth2 v0.6.0 golang.org/x/oauth2 v0.8.0
google.golang.org/api v0.115.0 google.golang.org/api v0.115.0
google.golang.org/grpc v1.54.0 google.golang.org/grpc v1.54.0
gopkg.in/couchbase/gocb.v1 v1.6.7 gopkg.in/couchbase/gocb.v1 v1.6.7
@ -128,7 +127,7 @@ require (
k8s.io/apimachinery v0.26.3 k8s.io/apimachinery v0.26.3
k8s.io/client-go v0.26.3 k8s.io/client-go v0.26.3
k8s.io/utils v0.0.0-20230313181309-38a27ef9d749 k8s.io/utils v0.0.0-20230313181309-38a27ef9d749
modernc.org/sqlite v1.21.1 modernc.org/sqlite v1.22.1
) )
require ( require (
@ -249,6 +248,7 @@ require (
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect
@ -360,13 +360,13 @@ require (
go.opencensus.io v0.24.0 // indirect go.opencensus.io v0.24.0 // indirect
go.uber.org/atomic v1.10.0 // indirect go.uber.org/atomic v1.10.0 // indirect
go.uber.org/zap v1.24.0 // indirect go.uber.org/zap v1.24.0 // indirect
golang.org/x/arch v0.2.0 // indirect golang.org/x/arch v0.3.0 // indirect
golang.org/x/sync v0.1.0 // indirect golang.org/x/sync v0.2.0 // indirect
golang.org/x/sys v0.7.0 // indirect golang.org/x/sys v0.8.0 // indirect
golang.org/x/term v0.7.0 // indirect golang.org/x/term v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect golang.org/x/text v0.9.0 // indirect
golang.org/x/time v0.3.0 // indirect golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.7.0 // indirect golang.org/x/tools v0.9.1 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
google.golang.org/appengine v1.6.7 // indirect google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd // indirect google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd // indirect
@ -388,7 +388,7 @@ require (
lukechampine.com/uint128 v1.3.0 // indirect lukechampine.com/uint128 v1.3.0 // indirect
modernc.org/cc/v3 v3.40.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect
modernc.org/ccgo/v3 v3.16.13 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect
modernc.org/libc v1.22.3 // indirect modernc.org/libc v1.22.6 // indirect
modernc.org/mathutil v1.5.0 // indirect modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect
modernc.org/opt v0.1.3 // indirect modernc.org/opt v0.1.3 // indirect

74
go.sum
View File

@ -615,8 +615,9 @@ github.com/awslabs/kinesis-aggregation/go v0.0.0-20210630091500-54e17340d32f h1:
github.com/awslabs/kinesis-aggregation/go v0.0.0-20210630091500-54e17340d32f/go.mod h1:SghidfnxvX7ribW6nHI7T+IBbc9puZ9kk5Tx/88h8P4= github.com/awslabs/kinesis-aggregation/go v0.0.0-20210630091500-54e17340d32f/go.mod h1:SghidfnxvX7ribW6nHI7T+IBbc9puZ9kk5Tx/88h8P4=
github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.4 h1:wj3BFPrTw8yYgA1OlMqvUk95nc8OMv3cvBSF5erT2W4=
github.com/benbjohnson/clock v1.3.4/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@ -783,8 +784,8 @@ github.com/dancannon/gorethink v4.0.0+incompatible h1:KFV7Gha3AuqT+gr0B/eKvGhbjm
github.com/dancannon/gorethink v4.0.0+incompatible/go.mod h1:BLvkat9KmZc1efyYwhz3WnybhRZtgF1K929FD8z1avU= github.com/dancannon/gorethink v4.0.0+incompatible/go.mod h1:BLvkat9KmZc1efyYwhz3WnybhRZtgF1K929FD8z1avU=
github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0=
github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0=
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce h1:Izd5gVwKZ9Gn01nXOENaM1sJRsmJFK7JO+OfHWeOh2M= github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg=
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY=
github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@ -891,7 +892,7 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
@ -976,8 +977,9 @@ github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPr
github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
@ -1414,8 +1416,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@ -1770,8 +1772,8 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY= github.com/rs/zerolog v1.28.0 h1:MirSo27VyNi7RJYP3078AA1+Cyzd2GB66qy3aUHvsWY=
github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/rs/zerolog v1.28.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0=
@ -1799,8 +1801,8 @@ github.com/shirou/gopsutil/v3 v3.21.6/go.mod h1:JfVbDpIBLVzT8oKbvMg9P3wEIMDDpVn+
github.com/shirou/gopsutil/v3 v3.22.2 h1:wCrArWFkHYIdDxx/FSfF5RB4dpJYW6t7rcp3+zL8uks= github.com/shirou/gopsutil/v3 v3.22.2 h1:wCrArWFkHYIdDxx/FSfF5RB4dpJYW6t7rcp3+zL8uks=
github.com/shirou/gopsutil/v3 v3.22.2/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY= github.com/shirou/gopsutil/v3 v3.22.2/go.mod h1:WapW1AOOPlHyXr+yOyw3uYx36enocrtSoSBy0L5vUHY=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/sijms/go-ora/v2 v2.6.11 h1:inBa/Tp0/kEl2prd3p5VabDXvmgVEelg328RYwsOCiE= github.com/sijms/go-ora/v2 v2.7.6 h1:QyR1CKFxG+VVk2+LdHoHF4NxDSvcQ3deBXtZCrahSq4=
github.com/sijms/go-ora/v2 v2.6.11/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk= github.com/sijms/go-ora/v2 v2.7.6/go.mod h1:EHxlY6x7y9HAsdfumurRfTd+v8NrEOTR3Xl4FWlH6xk=
github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
@ -1835,8 +1837,8 @@ github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
@ -1932,8 +1934,8 @@ github.com/urfave/cli/v2 v2.11.0/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhA
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.21.0/go.mod h1:jjraHZVbKOXftJfsOYoAjaeygpj5hr8ermTRJNroD7A= github.com/valyala/fasthttp v1.21.0/go.mod h1:jjraHZVbKOXftJfsOYoAjaeygpj5hr8ermTRJNroD7A=
github.com/valyala/fasthttp v1.45.0 h1:zPkkzpIn8tdHZUrVa6PzYd0i5verqiPSkgTd3bSUcpA= github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c=
github.com/valyala/fasthttp v1.45.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8=
github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
@ -2089,8 +2091,9 @@ go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
goji.io v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c= goji.io v2.0.2+incompatible h1:uIssv/elbKRLznFUy3Xj4+2Mz/qKhek/9aZQDUMae7c=
golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=
golang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=
golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@ -2122,8 +2125,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU= golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@ -2139,8 +2142,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@ -2273,8 +2276,8 @@ golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -2302,8 +2305,8 @@ golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri
golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg=
golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
golang.org/x/oauth2 v0.6.0 h1:Lh8GPgSKBfWSwFvtuWOfeI3aAAnbXTSutYxJiOJFgIw= golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8=
golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -2319,8 +2322,9 @@ golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220923202941-7f9b1623fab7/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180828065106-d99a578cf41b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180828065106-d99a578cf41b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -2464,8 +2468,8 @@ golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.1-0.20230105183443-b8be2fde2a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.1-0.20230105183443-b8be2fde2a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
@ -2475,8 +2479,8 @@ golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA=
golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -2587,8 +2591,8 @@ golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -2967,22 +2971,22 @@ modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw=
modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY=
modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= modernc.org/libc v1.22.6 h1:cbXU8R+A6aOjRuhsFh3nbDWXO/Hs4ClJRXYB11KmPDo=
modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= modernc.org/libc v1.22.6/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY=
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds=
modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE=
modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=
modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY=
modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw=
modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY=
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=

View File

@ -26,11 +26,9 @@ import (
type dbAccess interface { type dbAccess interface {
Init(ctx context.Context, metadata state.Metadata) error Init(ctx context.Context, metadata state.Metadata) error
Set(ctx context.Context, req *state.SetRequest) error Set(ctx context.Context, req *state.SetRequest) error
BulkSet(ctx context.Context, req []state.SetRequest) error
Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error)
BulkGet(ctx context.Context, req []state.GetRequest) ([]state.BulkGetResponse, error) BulkGet(ctx context.Context, req []state.GetRequest) ([]state.BulkGetResponse, error)
Delete(ctx context.Context, req *state.DeleteRequest) error Delete(ctx context.Context, req *state.DeleteRequest) error
BulkDelete(ctx context.Context, req []state.DeleteRequest) error
ExecuteMulti(ctx context.Context, req *state.TransactionalStateRequest) error ExecuteMulti(ctx context.Context, req *state.TransactionalStateRequest) error
Query(ctx context.Context, req *state.QueryRequest) (*state.QueryResponse, error) Query(ctx context.Context, req *state.QueryRequest) (*state.QueryResponse, error)
Close() error // io.Closer Close() error // io.Closer

View File

@ -32,6 +32,7 @@ import (
"github.com/dapr/components-contrib/state/query" "github.com/dapr/components-contrib/state/query"
stateutils "github.com/dapr/components-contrib/state/utils" stateutils "github.com/dapr/components-contrib/state/utils"
"github.com/dapr/kit/logger" "github.com/dapr/kit/logger"
"github.com/dapr/kit/ptr"
) )
var errMissingConnectionString = errors.New("missing connection string") var errMissingConnectionString = errors.New("missing connection string")
@ -228,32 +229,6 @@ func (p *PostgresDBAccess) doSet(parentCtx context.Context, db dbquerier, req *s
return nil return nil
} }
func (p *PostgresDBAccess) BulkSet(parentCtx context.Context, req []state.SetRequest) error {
tx, err := p.beginTx(parentCtx)
if err != nil {
return err
}
defer p.rollbackTx(parentCtx, tx, "BulkSet")
if len(req) > 0 {
for i := range req {
err = p.doSet(parentCtx, tx, &req[i])
if err != nil {
return err
}
}
}
ctx, cancel := context.WithTimeout(parentCtx, p.metadata.Timeout)
err = tx.Commit(ctx)
cancel()
if err != nil {
return fmt.Errorf("failed to commit transaction: %w", err)
}
return nil
}
// Get returns data from the database. If data does not exist for the key an empty state.GetResponse will be returned. // Get returns data from the database. If data does not exist for the key an empty state.GetResponse will be returned.
func (p *PostgresDBAccess) Get(parentCtx context.Context, req *state.GetRequest) (*state.GetResponse, error) { func (p *PostgresDBAccess) Get(parentCtx context.Context, req *state.GetRequest) (*state.GetResponse, error) {
if req.Key == "" { if req.Key == "" {
@ -280,7 +255,7 @@ func (p *PostgresDBAccess) Get(parentCtx context.Context, req *state.GetRequest)
return &state.GetResponse{ return &state.GetResponse{
Data: value, Data: value,
ETag: &etag, ETag: etag,
}, nil }, nil
} }
@ -314,36 +289,32 @@ func (p *PostgresDBAccess) BulkGet(parentCtx context.Context, req []state.GetReq
} }
// Scan all rows // Scan all rows
var ( var n int
n int
etag string
)
res := make([]state.BulkGetResponse, len(req)) res := make([]state.BulkGetResponse, len(req))
for ; rows.Next(); n++ { for ; rows.Next(); n++ {
r := state.BulkGetResponse{} r := state.BulkGetResponse{}
r.Key, r.Data, etag, err = readRow(rows) r.Key, r.Data, r.ETag, err = readRow(rows)
if err != nil { if err != nil {
r.Error = err.Error() r.Error = err.Error()
} }
r.ETag = &etag
res[n] = r res[n] = r
} }
return res[:n], nil return res[:n], nil
} }
func readRow(row pgx.Row) (key string, value []byte, etagS string, err error) { func readRow(row pgx.Row) (key string, value []byte, etagS *string, err error) {
var ( var (
isBinary bool isBinary bool
etag pgtype.Int8 etag pgtype.Int8
) )
err = row.Scan(&key, &value, &isBinary, &etag) err = row.Scan(&key, &value, &isBinary, &etag)
if err != nil { if err != nil {
return key, nil, "", err return key, nil, nil, err
} }
if etag.Valid { if etag.Valid {
etagS = strconv.FormatInt(etag.Int64, 10) etagS = ptr.Of(strconv.FormatInt(etag.Int64, 10))
} }
if isBinary { if isBinary {
@ -354,12 +325,12 @@ func readRow(row pgx.Row) (key string, value []byte, etagS string, err error) {
err = json.Unmarshal(value, &s) err = json.Unmarshal(value, &s)
if err != nil { if err != nil {
return key, nil, "", fmt.Errorf("failed to unmarshal JSON data: %w", err) return key, nil, nil, fmt.Errorf("failed to unmarshal JSON data: %w", err)
} }
data, err = base64.StdEncoding.DecodeString(s) data, err = base64.StdEncoding.DecodeString(s)
if err != nil { if err != nil {
return key, nil, "", fmt.Errorf("failed to decode base64 data: %w", err) return key, nil, nil, fmt.Errorf("failed to decode base64 data: %w", err)
} }
return key, data, etagS, nil return key, data, etagS, nil
@ -405,32 +376,6 @@ func (p *PostgresDBAccess) doDelete(parentCtx context.Context, db dbquerier, req
return nil return nil
} }
func (p *PostgresDBAccess) BulkDelete(parentCtx context.Context, req []state.DeleteRequest) error {
tx, err := p.beginTx(parentCtx)
if err != nil {
return err
}
defer p.rollbackTx(parentCtx, tx, "BulkDelete")
if len(req) > 0 {
for i := range req {
err = p.doDelete(parentCtx, tx, &req[i])
if err != nil {
return err
}
}
}
ctx, cancel := context.WithTimeout(parentCtx, p.metadata.Timeout)
err = tx.Commit(ctx)
cancel()
if err != nil {
return fmt.Errorf("failed to commit transaction: %w", err)
}
return nil
}
func (p *PostgresDBAccess) ExecuteMulti(parentCtx context.Context, request *state.TransactionalStateRequest) error { func (p *PostgresDBAccess) ExecuteMulti(parentCtx context.Context, request *state.TransactionalStateRequest) error {
tx, err := p.beginTx(parentCtx) tx, err := p.beginTx(parentCtx)
if err != nil { if err != nil {

View File

@ -180,118 +180,6 @@ func TestMultiOperationOrder(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
} }
func TestInvalidBulkSetNoKey(t *testing.T) {
// Arrange
m, _ := mockDatabase(t)
defer m.db.Close()
m.db.ExpectBegin()
m.db.ExpectRollback()
sets := []state.SetRequest{
// Set request without key is not valid for Set operation
{Value: "value1"},
}
// Act
err := m.pgDba.BulkSet(context.Background(), sets)
// Assert
assert.Error(t, err)
}
func TestInvalidBulkSetEmptyValue(t *testing.T) {
// Arrange
m, _ := mockDatabase(t)
defer m.db.Close()
m.db.ExpectBegin()
m.db.ExpectRollback()
sets := []state.SetRequest{
// Set request without value is not valid for Set operation
{Key: "key1", Value: "value1"},
}
// Act
err := m.pgDba.BulkSet(context.Background(), sets)
// Assert
assert.Error(t, err)
}
func TestValidBulkSet(t *testing.T) {
// Arrange
m, _ := mockDatabase(t)
defer m.db.Close()
sets := []state.SetRequest{
{
Key: "key1",
Value: "value1",
},
}
m.db.ExpectBegin()
m.db.ExpectExec("INSERT INTO").
WithArgs("key1", `"value1"`, false).
WillReturnResult(pgxmock.NewResult("INSERT", 1))
m.db.ExpectCommit()
// There's also a rollback called after a commit, which is expected and will not have effect
m.db.ExpectRollback()
// Act
err := m.pgDba.BulkSet(context.Background(), sets)
// Assert
assert.NoError(t, err)
}
func TestInvalidBulkDeleteNoKey(t *testing.T) {
// Arrange
m, _ := mockDatabase(t)
defer m.db.Close()
m.db.ExpectBegin()
m.db.ExpectRollback()
var deletes []state.DeleteRequest
deletes = append(deletes, state.DeleteRequest{ // Delete request without key is not valid for Delete operation
Key: "",
})
// Act
err := m.pgDba.BulkDelete(context.Background(), deletes)
// Assert
assert.Error(t, err)
}
func TestValidBulkDelete(t *testing.T) {
// Arrange
m, _ := mockDatabase(t)
defer m.db.Close()
deletes := []state.DeleteRequest{
{Key: "key1"},
}
m.db.ExpectBegin()
m.db.ExpectExec("DELETE FROM").
WithArgs("key1").
WillReturnResult(pgxmock.NewResult("DELETE", 1))
m.db.ExpectCommit()
// There's also a rollback called after a commit, which is expected and will not have effect
m.db.ExpectRollback()
// Act
err := m.pgDba.BulkDelete(context.Background(), deletes)
// Assert
assert.NoError(t, err)
}
func createSetRequest() state.SetRequest { func createSetRequest() state.SetRequest {
return state.SetRequest{ return state.SetRequest{
Key: randomKey(), Key: randomKey(),

View File

@ -79,11 +79,6 @@ func (p *PostgreSQL) Delete(ctx context.Context, req *state.DeleteRequest) error
return p.dbaccess.Delete(ctx, req) return p.dbaccess.Delete(ctx, req)
} }
// BulkDelete removes multiple entries from the store.
func (p *PostgreSQL) BulkDelete(ctx context.Context, req []state.DeleteRequest) error {
return p.dbaccess.BulkDelete(ctx, req)
}
// Get returns an entity from store. // Get returns an entity from store.
func (p *PostgreSQL) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) { func (p *PostgreSQL) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) {
return p.dbaccess.Get(ctx, req) return p.dbaccess.Get(ctx, req)
@ -100,11 +95,6 @@ func (p *PostgreSQL) Set(ctx context.Context, req *state.SetRequest) error {
return p.dbaccess.Set(ctx, req) return p.dbaccess.Set(ctx, req)
} }
// BulkSet adds/updates multiple entities on store.
func (p *PostgreSQL) BulkSet(ctx context.Context, req []state.SetRequest) error {
return p.dbaccess.BulkSet(ctx, req)
}
// Multi handles multiple transactions. Implements TransactionalStore. // Multi handles multiple transactions. Implements TransactionalStore.
func (p *PostgreSQL) Multi(ctx context.Context, request *state.TransactionalStateRequest) error { func (p *PostgreSQL) Multi(ctx context.Context, request *state.TransactionalStateRequest) error {
return p.dbaccess.ExecuteMulti(ctx, request) return p.dbaccess.ExecuteMulti(ctx, request)

View File

@ -66,14 +66,6 @@ func (m *fakeDBaccess) Delete(ctx context.Context, req *state.DeleteRequest) err
return nil return nil
} }
func (m *fakeDBaccess) BulkSet(ctx context.Context, req []state.SetRequest) error {
return nil
}
func (m *fakeDBaccess) BulkDelete(ctx context.Context, req []state.DeleteRequest) error {
return nil
}
func (m *fakeDBaccess) ExecuteMulti(ctx context.Context, req *state.TransactionalStateRequest) error { func (m *fakeDBaccess) ExecuteMulti(ctx context.Context, req *state.TransactionalStateRequest) error {
return nil return nil
} }

View File

@ -215,35 +215,6 @@ func (s *AliCloudTableStore) deleteRowChange(req *state.DeleteRequest) *tablesto
return change return change
} }
func (s *AliCloudTableStore) BulkSet(ctx context.Context, reqs []state.SetRequest) error {
return s.batchWrite(ctx, reqs, nil)
}
func (s *AliCloudTableStore) BulkDelete(ctx context.Context, reqs []state.DeleteRequest) error {
return s.batchWrite(ctx, nil, reqs)
}
func (s *AliCloudTableStore) batchWrite(ctx context.Context, setReqs []state.SetRequest, deleteReqs []state.DeleteRequest) error {
bathReq := &tablestore.BatchWriteRowRequest{
IsAtomic: true,
}
for i := range setReqs {
bathReq.AddRowChange(s.updateRowChange(&setReqs[i]))
}
for i := range deleteReqs {
bathReq.AddRowChange(s.deleteRowChange(&deleteReqs[i]))
}
_, err := s.client.BatchWriteRow(bathReq)
if err != nil {
return err
}
return nil
}
func (s *AliCloudTableStore) parse(meta state.Metadata) (*tablestoreMetadata, error) { func (s *AliCloudTableStore) parse(meta state.Metadata) (*tablestoreMetadata, error) {
var m tablestoreMetadata var m tablestoreMetadata
err := metadata.DecodeMetadata(meta.Properties, &m) err := metadata.DecodeMetadata(meta.Properties, &m)

View File

@ -55,6 +55,7 @@ func TestReadAndWrite(t *testing.T) {
store := &AliCloudTableStore{ store := &AliCloudTableStore{
logger: logger.NewLogger("test"), logger: logger.NewLogger("test"),
} }
store.BulkStore = state.NewDefaultBulkStore(store)
store.Init(context.Background(), state.Metadata{}) store.Init(context.Background(), state.Metadata{})
store.client = &mockClient{ store.client = &mockClient{
@ -108,7 +109,7 @@ func TestReadAndWrite(t *testing.T) {
}, { }, {
Key: "theSecondKey", Key: "theSecondKey",
Value: "777", Value: "777",
}}) }}, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
}) })

View File

@ -187,44 +187,6 @@ func (d *StateStore) Set(ctx context.Context, req *state.SetRequest) error {
return err return err
} }
// BulkSet performs a bulk set operation.
func (d *StateStore) BulkSet(ctx context.Context, req []state.SetRequest) error {
if len(req) == 1 {
return d.Set(ctx, &req[0])
}
writeRequests := make([]*dynamodb.WriteRequest, len(req))
for i := range req {
if req[i].ETag != nil && *req[i].ETag != "" {
return errors.New("dynamodb error: BulkSet() does not support etags; please use Set() instead")
}
if req[i].Options.Concurrency == state.FirstWrite {
return errors.New("dynamodb error: BulkSet() does not support FirstWrite concurrency; please use Set() instead")
}
item, err := d.getItemFromReq(&req[i])
if err != nil {
return err
}
writeRequests[i] = &dynamodb.WriteRequest{
PutRequest: &dynamodb.PutRequest{
Item: item,
},
}
}
requestItems := map[string][]*dynamodb.WriteRequest{
d.table: writeRequests,
}
_, e := d.client.BatchWriteItemWithContext(ctx, &dynamodb.BatchWriteItemInput{
RequestItems: requestItems,
})
return e
}
// Delete performs a delete operation. // Delete performs a delete operation.
func (d *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error { func (d *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error {
input := &dynamodb.DeleteItemInput{ input := &dynamodb.DeleteItemInput{
@ -257,40 +219,6 @@ func (d *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error
return err return err
} }
// BulkDelete performs a bulk delete operation.
func (d *StateStore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error {
if len(req) == 1 {
return d.Delete(ctx, &req[0])
}
writeRequests := make([]*dynamodb.WriteRequest, len(req))
for i, r := range req {
if r.ETag != nil && *r.ETag != "" {
return errors.New("dynamodb error: BulkDelete() does not support etags; please use Delete() instead")
}
writeRequests[i] = &dynamodb.WriteRequest{
DeleteRequest: &dynamodb.DeleteRequest{
Key: map[string]*dynamodb.AttributeValue{
d.partitionKey: {
S: aws.String(r.Key),
},
},
},
}
}
requestItems := map[string][]*dynamodb.WriteRequest{
d.table: writeRequests,
}
_, e := d.client.BatchWriteItemWithContext(ctx, &dynamodb.BatchWriteItemInput{
RequestItems: requestItems,
})
return e
}
func (d *StateStore) GetComponentMetadata() map[string]string { func (d *StateStore) GetComponentMetadata() map[string]string {
metadataStruct := dynamoDBMetadata{} metadataStruct := dynamoDBMetadata{}
metadataInfo := map[string]string{} metadataInfo := map[string]string{}

View File

@ -18,7 +18,6 @@ package dynamodb
import ( import (
"context" "context"
"fmt" "fmt"
"strconv"
"testing" "testing"
"time" "time"
@ -663,256 +662,6 @@ func TestSet(t *testing.T) {
}) })
} }
func TestBulkSet(t *testing.T) {
type value struct {
Value string
}
t.Run("Successfully set items", func(t *testing.T) {
ss := &StateStore{
partitionKey: defaultPartitionKeyName,
}
ss.client = &mockedDynamoDB{
BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) {
expected := map[string][]*dynamodb.WriteRequest{}
expected[tableName] = []*dynamodb.WriteRequest{
{
PutRequest: &dynamodb.PutRequest{
Item: map[string]*dynamodb.AttributeValue{
"key": {
S: aws.String("key1"),
},
"value": {
S: aws.String(`{"Value":"value1"}`),
},
},
},
},
{
PutRequest: &dynamodb.PutRequest{
Item: map[string]*dynamodb.AttributeValue{
"key": {
S: aws.String("key2"),
},
"value": {
S: aws.String(`{"Value":"value2"}`),
},
},
},
},
}
for tbl := range expected {
for reqNum := range expected[tbl] {
expectedItem := expected[tbl][reqNum].PutRequest.Item
inputItem := input.RequestItems[tbl][reqNum].PutRequest.Item
assert.Equal(t, expectedItem["key"], inputItem["key"])
assert.Equal(t, expectedItem["value"], inputItem["value"])
}
}
return &dynamodb.BatchWriteItemOutput{
UnprocessedItems: map[string][]*dynamodb.WriteRequest{},
}, nil
},
}
ss.table = tableName
req := []state.SetRequest{
{
Key: "key1",
Value: value{
Value: "value1",
},
},
{
Key: "key2",
Value: value{
Value: "value2",
},
},
}
err := ss.BulkSet(context.Background(), req)
assert.NoError(t, err)
})
t.Run("Successfully set items with ttl = -1", func(t *testing.T) {
ss := &StateStore{
partitionKey: defaultPartitionKeyName,
}
ss.client = &mockedDynamoDB{
BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) {
expected := map[string][]*dynamodb.WriteRequest{}
expected[tableName] = []*dynamodb.WriteRequest{
{
PutRequest: &dynamodb.PutRequest{
Item: map[string]*dynamodb.AttributeValue{
"key": {
S: aws.String("key1"),
},
"value": {
S: aws.String(`{"Value":"value1"}`),
},
"testAttributeName": {
N: aws.String(strconv.FormatInt(time.Now().Unix()-1, 10)),
},
},
},
},
{
PutRequest: &dynamodb.PutRequest{
Item: map[string]*dynamodb.AttributeValue{
"key": {
S: aws.String("key2"),
},
"value": {
S: aws.String(`{"Value":"value2"}`),
},
},
},
},
}
for tbl := range expected {
for reqNum := range expected[tbl] {
expectedItem := expected[tbl][reqNum].PutRequest.Item
inputItem := input.RequestItems[tbl][reqNum].PutRequest.Item
assert.Equal(t, expectedItem["key"], inputItem["key"])
assert.Equal(t, expectedItem["value"], inputItem["value"])
}
}
return &dynamodb.BatchWriteItemOutput{
UnprocessedItems: map[string][]*dynamodb.WriteRequest{},
}, nil
},
}
ss.table = tableName
ss.ttlAttributeName = "testAttributeName"
req := []state.SetRequest{
{
Key: "key1",
Value: value{
Value: "value1",
},
Metadata: map[string]string{
"ttlInSeconds": "-1",
},
},
{
Key: "key2",
Value: value{
Value: "value2",
},
},
}
err := ss.BulkSet(context.Background(), req)
assert.NoError(t, err)
})
t.Run("Successfully set items with ttl", func(t *testing.T) {
ss := &StateStore{
partitionKey: defaultPartitionKeyName,
}
ss.client = &mockedDynamoDB{
BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) {
expected := map[string][]*dynamodb.WriteRequest{}
// This might fail occasionally due to timestamp precision.
timestamp := time.Now().Unix() + 90
expected[tableName] = []*dynamodb.WriteRequest{
{
PutRequest: &dynamodb.PutRequest{
Item: map[string]*dynamodb.AttributeValue{
"key": {
S: aws.String("key1"),
},
"value": {
S: aws.String(`{"Value":"value1"}`),
},
"testAttributeName": {
N: aws.String(strconv.FormatInt(timestamp, 10)),
},
},
},
},
{
PutRequest: &dynamodb.PutRequest{
Item: map[string]*dynamodb.AttributeValue{
"key": {
S: aws.String("key2"),
},
"value": {
S: aws.String(`{"Value":"value2"}`),
},
},
},
},
}
for tbl := range expected {
for reqNum := range expected[tbl] {
expectedItem := expected[tbl][reqNum].PutRequest.Item
inputItem := input.RequestItems[tbl][reqNum].PutRequest.Item
assert.Equal(t, expectedItem["key"], inputItem["key"])
assert.Equal(t, expectedItem["value"], inputItem["value"])
}
}
return &dynamodb.BatchWriteItemOutput{
UnprocessedItems: map[string][]*dynamodb.WriteRequest{},
}, nil
},
}
ss.table = tableName
ss.ttlAttributeName = "testAttributeName"
req := []state.SetRequest{
{
Key: "key1",
Value: value{
Value: "value1",
},
Metadata: map[string]string{
"ttlInSeconds": "90",
},
},
{
Key: "key2",
Value: value{
Value: "value2",
},
},
}
err := ss.BulkSet(context.Background(), req)
assert.NoError(t, err)
})
t.Run("Unsuccessfully set items", func(t *testing.T) {
ss := StateStore{
client: &mockedDynamoDB{
BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) {
return nil, fmt.Errorf("unable to bulk write items")
},
},
}
req := []state.SetRequest{
{
Key: "key",
Value: value{
Value: "value",
},
},
{
Key: "key",
Value: value{
Value: "value",
},
},
}
err := ss.BulkSet(context.Background(), req)
assert.Error(t, err)
})
}
func TestDelete(t *testing.T) { func TestDelete(t *testing.T) {
t.Run("Successfully delete item", func(t *testing.T) { t.Run("Successfully delete item", func(t *testing.T) {
req := &state.DeleteRequest{ req := &state.DeleteRequest{
@ -1020,75 +769,6 @@ func TestDelete(t *testing.T) {
}) })
} }
func TestBulkDelete(t *testing.T) {
t.Run("Successfully delete items", func(t *testing.T) {
ss := &StateStore{
partitionKey: defaultPartitionKeyName,
}
ss.client = &mockedDynamoDB{
BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) {
expected := map[string][]*dynamodb.WriteRequest{}
expected[tableName] = []*dynamodb.WriteRequest{
{
DeleteRequest: &dynamodb.DeleteRequest{
Key: map[string]*dynamodb.AttributeValue{
"key": {
S: aws.String("key1"),
},
},
},
},
{
DeleteRequest: &dynamodb.DeleteRequest{
Key: map[string]*dynamodb.AttributeValue{
"key": {
S: aws.String("key2"),
},
},
},
},
}
assert.Equal(t, expected, input.RequestItems)
return &dynamodb.BatchWriteItemOutput{
UnprocessedItems: map[string][]*dynamodb.WriteRequest{},
}, nil
},
}
ss.table = tableName
req := []state.DeleteRequest{
{
Key: "key1",
},
{
Key: "key2",
},
}
err := ss.BulkDelete(context.Background(), req)
assert.NoError(t, err)
})
t.Run("Unsuccessfully delete items", func(t *testing.T) {
ss := StateStore{
client: &mockedDynamoDB{
BatchWriteItemWithContextFn: func(ctx context.Context, input *dynamodb.BatchWriteItemInput, op ...request.Option) (output *dynamodb.BatchWriteItemOutput, err error) {
return nil, fmt.Errorf("unable to bulk write items")
},
},
}
req := []state.DeleteRequest{
{
Key: "key",
},
{
Key: "key",
},
}
err := ss.BulkDelete(context.Background(), req)
assert.Error(t, err)
})
}
func TestMultiTx(t *testing.T) { func TestMultiTx(t *testing.T) {
t.Run("Successfully Multiple Transaction Operations", func(t *testing.T) { t.Run("Successfully Multiple Transaction Operations", func(t *testing.T) {
ss := &StateStore{ ss := &StateStore{

View File

@ -42,6 +42,8 @@ import (
// StateStore is a CosmosDB state store. // StateStore is a CosmosDB state store.
type StateStore struct { type StateStore struct {
state.BulkStore
client *azcosmos.ContainerClient client *azcosmos.ContainerClient
metadata metadata metadata metadata
contentType string contentType string
@ -96,9 +98,11 @@ func (p crossPartitionQueryPolicy) Do(req *policy.Request) (*http.Response, erro
// NewCosmosDBStateStore returns a new CosmosDB state store. // NewCosmosDBStateStore returns a new CosmosDB state store.
func NewCosmosDBStateStore(logger logger.Logger) state.Store { func NewCosmosDBStateStore(logger logger.Logger) state.Store {
return &StateStore{ s := &StateStore{
logger: logger, logger: logger,
} }
s.BulkStore = state.NewDefaultBulkStore(s)
return s
} }
func (c *StateStore) GetComponentMetadata() map[string]string { func (c *StateStore) GetComponentMetadata() map[string]string {
@ -414,16 +418,15 @@ func (c *StateStore) Set(ctx context.Context, req *state.SetRequest) error {
pk := azcosmos.NewPartitionKeyString(partitionKey) pk := azcosmos.NewPartitionKeyString(partitionKey)
_, err = c.client.UpsertItem(upsertCtx, pk, marsh, &options) _, err = c.client.UpsertItem(upsertCtx, pk, marsh, &options)
if err != nil { if err != nil {
resErr := &azcore.ResponseError{}
if errors.As(err, &resErr) && resErr.StatusCode == http.StatusPreconditionFailed {
return state.NewETagError(state.ETagMismatch, err)
}
return err return err
} }
return nil return nil
} }
// BulkSet performs a bulk save operation.
func (c *StateStore) BulkSet(ctx context.Context, req []state.SetRequest) error {
return c.doBulkSetDelete(ctx, state.ToTransactionalStateOperationSlice(req))
}
// Delete performs a delete operation. // Delete performs a delete operation.
func (c *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error { func (c *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error {
err := state.CheckRequestOptions(req.Options) err := state.CheckRequestOptions(req.Options)
@ -456,7 +459,8 @@ func (c *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error
pk := azcosmos.NewPartitionKeyString(partitionKey) pk := azcosmos.NewPartitionKeyString(partitionKey)
_, err = c.client.DeleteItem(deleteCtx, pk, req.Key, &options) _, err = c.client.DeleteItem(deleteCtx, pk, req.Key, &options)
if err != nil && !isNotFoundError(err) { if err != nil && !isNotFoundError(err) {
if req.ETag != nil && *req.ETag != "" { resErr := &azcore.ResponseError{}
if errors.As(err, &resErr) && resErr.StatusCode == http.StatusPreconditionFailed {
return state.NewETagError(state.ETagMismatch, err) return state.NewETagError(state.ETagMismatch, err)
} }
return err return err
@ -465,52 +469,6 @@ func (c *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error
return nil return nil
} }
// BulkDelete performs a bulk delete operation.
func (c *StateStore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error {
return c.doBulkSetDelete(ctx, state.ToTransactionalStateOperationSlice(req))
}
// Custom implementation for BulkSet and BulkDelete. We can't use the standard in DefaultBulkStore because we need to be aware of partition keys.
func (c *StateStore) doBulkSetDelete(ctx context.Context, req []state.TransactionalStateOperation) error {
// Group all requests by partition key
// This has initial size of len(req) as pessimistic scenario
partitions := make(map[string]*state.TransactionalStateRequest, len(req))
for i := range req {
r := req[i]
pk := populatePartitionMetadata(r.GetKey(), r.GetMetadata())
if partitions[pk] == nil {
partitions[pk] = &state.TransactionalStateRequest{
Operations: make([]state.TransactionalStateOperation, 0),
Metadata: map[string]string{
metadataPartitionKey: pk,
},
}
}
partitions[pk].Operations = append(partitions[pk].Operations, r)
}
// Execute all transactions in parallel
errs := make(chan error)
for pk := range partitions {
go func(pk string) {
err := c.Multi(ctx, partitions[pk])
if err != nil {
err = fmt.Errorf("error while processing bulk set in partition %s: %w", pk, err)
}
errs <- err
}(pk)
}
// Wait for all results
var err error
for i := 0; i < len(partitions); i++ {
err = errors.Join(<-errs)
}
return err
}
// Multi performs a transactional operation. Succeeds only if all operations succeed, and fails if one or more operations fail. // Multi performs a transactional operation. Succeeds only if all operations succeed, and fails if one or more operations fail.
// Note that all operations must be in the same partition. // Note that all operations must be in the same partition.
func (c *StateStore) Multi(ctx context.Context, request *state.TransactionalStateRequest) (err error) { func (c *StateStore) Multi(ctx context.Context, request *state.TransactionalStateRequest) (err error) {

View File

@ -16,9 +16,10 @@ package state
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"errors"
) )
// BulkGetOpts contains options for the BulkGet method // BulkGetOpts contains options for the BulkGet method.
type BulkGetOpts struct { type BulkGetOpts struct {
// Number of requests made in parallel while retrieving values in bulk. // Number of requests made in parallel while retrieving values in bulk.
// When set to <= 0 (the default value), will fetch all requested values in bulk without limit. // When set to <= 0 (the default value), will fetch all requested values in bulk without limit.
@ -26,11 +27,18 @@ type BulkGetOpts struct {
Parallelism int Parallelism int
} }
// BulkStoreOpts contains options for the BulkSet and BulkDelete methods.
type BulkStoreOpts struct {
// Number of requests made in parallel while storing/deleting values in bulk.
// When set to <= 0 (the default value), will perform all operations in parallel without limit.
Parallelism int
}
// BulkStore is an interface to perform bulk operations on store. // BulkStore is an interface to perform bulk operations on store.
type BulkStore interface { type BulkStore interface {
BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error) BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error)
BulkDelete(ctx context.Context, req []DeleteRequest) error BulkSet(ctx context.Context, req []SetRequest, opts BulkStoreOpts) error
BulkSet(ctx context.Context, req []SetRequest) error BulkDelete(ctx context.Context, req []DeleteRequest, opts BulkStoreOpts) error
} }
// DefaultBulkStore is a default implementation of BulkStore. // DefaultBulkStore is a default implementation of BulkStore.
@ -47,6 +55,21 @@ func NewDefaultBulkStore(base BaseStore) BulkStore {
// BulkGet performs a Get operation in bulk. // BulkGet performs a Get operation in bulk.
func (b *DefaultBulkStore) BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error) { func (b *DefaultBulkStore) BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error) {
return DoBulkGet(ctx, req, opts, b.base.Get)
}
// BulkSet performs a bulk save operation.
func (b *DefaultBulkStore) BulkSet(ctx context.Context, req []SetRequest, opts BulkStoreOpts) error {
return DoBulkSetDelete(ctx, req, b.base.Set, opts)
}
// BulkDelete performs a bulk delete operation.
func (b *DefaultBulkStore) BulkDelete(ctx context.Context, req []DeleteRequest, opts BulkStoreOpts) error {
return DoBulkSetDelete(ctx, req, b.base.Delete, opts)
}
// DoBulkGet performs BulkGet.
func DoBulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts, getFn func(ctx context.Context, req *GetRequest) (*GetResponse, error)) ([]BulkGetResponse, error) {
// If parallelism isn't set, run all operations in parallel // If parallelism isn't set, run all operations in parallel
if opts.Parallelism <= 0 { if opts.Parallelism <= 0 {
opts.Parallelism = len(req) opts.Parallelism = len(req)
@ -64,7 +87,7 @@ func (b *DefaultBulkStore) BulkGet(ctx context.Context, req []GetRequest, opts B
r := req[i] r := req[i]
res[i].Key = r.Key res[i].Key = r.Key
item, rErr := b.base.Get(ctx, &r) item, rErr := getFn(ctx, &r)
if rErr != nil { if rErr != nil {
res[i].Error = rErr.Error() res[i].Error = rErr.Error()
return return
@ -86,51 +109,49 @@ func (b *DefaultBulkStore) BulkGet(ctx context.Context, req []GetRequest, opts B
return res, nil return res, nil
} }
// BulkSet performs a bulk save operation. type stateRequestConstraint interface {
func (b *DefaultBulkStore) BulkSet(ctx context.Context, req []SetRequest) error { SetRequest | DeleteRequest
// Check if the base implementation supports transactions StateRequest
if ts, ok := b.base.(TransactionalStore); ok { }
return ts.Multi(ctx, &TransactionalStateRequest{
Operations: ToTransactionalStateOperationSlice(req),
})
}
// Fallback to executing all operations in sequence // DoBulkSetDelete performs BulkSet and BulkDelete.
func DoBulkSetDelete[T stateRequestConstraint](ctx context.Context, req []T, method func(ctx context.Context, req *T) error, opts BulkStoreOpts) error {
// If parallelism isn't set, run all operations in parallel
var limitCh chan struct{}
if opts.Parallelism > 0 {
limitCh = make(chan struct{}, opts.Parallelism)
}
errCh := make(chan error, len(req))
// Execute all operations in parallel
for i := range req { for i := range req {
err := b.base.Set(ctx, &req[i]) // Limit concurrency
if err != nil { if limitCh != nil {
return err limitCh <- struct{}{}
}
} }
return nil go func(i int) {
} rErr := method(ctx, &req[i])
if rErr != nil {
// BulkDelete performs a bulk delete operation. errCh <- BulkStoreError{
func (b *DefaultBulkStore) BulkDelete(ctx context.Context, req []DeleteRequest) error { key: req[i].GetKey(),
// Check if the base implementation supports transactions err: rErr,
if ts, ok := b.base.(TransactionalStore); ok { }
return ts.Multi(ctx, &TransactionalStateRequest{ } else {
Operations: ToTransactionalStateOperationSlice(req), errCh <- nil
}) }
}
// Release the token for concurrency
// Fallback to executing all operations in sequence if limitCh != nil {
for i := range req { <-limitCh
err := b.base.Delete(ctx, &req[i]) }
if err != nil { }(i)
return err }
}
} errs := make([]error, len(req))
for i := 0; i < len(req); i++ {
return nil errs[i] = <-errCh
} }
// ToTransactionalStateOperationSlice is necessary to convert []SetRequest and []DeleteRequest to []TransactionalStateOperation. return errors.Join(errs...)
func ToTransactionalStateOperationSlice[T TransactionalStateOperation](req []T) []TransactionalStateOperation {
ops := make([]TransactionalStateOperation, len(req))
for i, r := range req {
ops[i] = r
}
return ops
} }

View File

@ -15,115 +15,115 @@ package state
import ( import (
"context" "context"
"errors"
"strings"
"sync/atomic"
"testing" "testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
var errSimulated = errors.New("simulated")
func TestBulkStore(t *testing.T) { func TestBulkStore(t *testing.T) {
t.Run("default implementation", func(t *testing.T) { t.Run("default implementation", func(t *testing.T) {
var ( var (
expectCount int expectCount int32
expectBulkCount int expectBulkCount int32
) )
ctx := context.Background()
s := &storeBulk{} s := &storeBulk{}
s.BulkStore = NewDefaultBulkStore(s) s.BulkStore = NewDefaultBulkStore(s)
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
s.Get(context.Background(), &GetRequest{}) s.Get(ctx, &GetRequest{})
s.Set(context.Background(), &SetRequest{}) s.Set(ctx, &SetRequest{})
s.Delete(context.Background(), &DeleteRequest{}) s.Delete(ctx, &DeleteRequest{})
expectCount += 3 expectCount += 3
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
_, err := s.BulkGet(context.Background(), []GetRequest{{}, {}, {}}, BulkGetOpts{}) _, err := s.BulkGet(ctx, []GetRequest{{}, {}, {}}, BulkGetOpts{})
require.NoError(t, err) require.NoError(t, err)
expectCount += 3 expectCount += 3
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
s.BulkSet(context.Background(), []SetRequest{{}, {}, {}, {}})
s.BulkSet(ctx, []SetRequest{{}, {}, {}, {}}, BulkStoreOpts{})
expectCount += 4 expectCount += 4
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
s.BulkDelete(context.Background(), []DeleteRequest{{}, {}, {}, {}, {}})
s.BulkDelete(ctx, []DeleteRequest{{}, {}, {}, {}, {}}, BulkStoreOpts{})
expectCount += 5 expectCount += 5
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
})
t.Run("default implementation on transactional store", func(t *testing.T) { // Test errors
var ( err = s.Set(ctx, &SetRequest{Key: "error-key"})
expectCount int require.Error(t, err)
expectTransactionalCount int expectCount++
expectBulkCount int require.Equal(t, errSimulated, err)
) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount.Load())
s := &storeBulkTransactional{} err = s.BulkSet(ctx, []SetRequest{{Key: "error-key1"}, {}, {Key: "error-key2"}, {}}, BulkStoreOpts{})
s.BulkStore = NewDefaultBulkStore(s) expectCount += 4
require.Equal(t, expectCount, s.count) require.Error(t, err)
require.Equal(t, expectTransactionalCount, s.transactionalCount) merr, ok := err.(interface{ Unwrap() []error })
require.Equal(t, expectBulkCount, s.bulkCount) require.True(t, ok)
errs := merr.Unwrap()
s.Get(context.Background(), &GetRequest{}) require.Len(t, errs, 2)
s.Set(context.Background(), &SetRequest{}) for i := 0; i < 2; i++ {
s.Delete(context.Background(), &DeleteRequest{}) var bse BulkStoreError
expectCount += 3 assert.ErrorAs(t, errs[i], &bse)
require.Equal(t, expectCount, s.count) assert.True(t, bse.key == "error-key1" || bse.key == "error-key2")
require.Equal(t, expectTransactionalCount, s.transactionalCount) assert.ErrorIs(t, bse, errSimulated)
require.Equal(t, expectBulkCount, s.bulkCount) assert.ErrorIs(t, errs[i], errSimulated)
}
_, err := s.BulkGet(context.Background(), []GetRequest{{}, {}, {}}, BulkGetOpts{}) require.Equal(t, expectCount, s.count.Load())
require.NoError(t, err) require.Equal(t, expectBulkCount, s.bulkCount.Load())
expectCount += 3
require.Equal(t, expectCount, s.count)
require.Equal(t, expectTransactionalCount, s.transactionalCount)
require.Equal(t, expectBulkCount, s.bulkCount)
s.BulkSet(context.Background(), []SetRequest{{}, {}, {}, {}})
expectTransactionalCount += 1
require.Equal(t, expectCount, s.count)
require.Equal(t, expectTransactionalCount, s.transactionalCount)
require.Equal(t, expectBulkCount, s.bulkCount)
s.BulkDelete(context.Background(), []DeleteRequest{{}, {}, {}, {}, {}})
expectTransactionalCount += 1
require.Equal(t, expectCount, s.count)
require.Equal(t, expectTransactionalCount, s.transactionalCount)
require.Equal(t, expectBulkCount, s.bulkCount)
}) })
t.Run("native bulk implementation", func(t *testing.T) { t.Run("native bulk implementation", func(t *testing.T) {
var ( var (
expectCount int expectCount int32
expectBulkCount int expectBulkCount int32
) )
ctx := context.Background()
s := &storeBulkNative{} s := &storeBulkNative{}
s.BulkStore = NewDefaultBulkStore(s) s.BulkStore = NewDefaultBulkStore(s)
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
s.Get(context.Background(), &GetRequest{}) s.Get(ctx, &GetRequest{})
s.Set(context.Background(), &SetRequest{}) s.Set(ctx, &SetRequest{})
s.Delete(context.Background(), &DeleteRequest{}) s.Delete(ctx, &DeleteRequest{})
expectCount += 3 expectCount += 3
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
_, _ = s.BulkGet(context.Background(), []GetRequest{{}, {}, {}}, BulkGetOpts{}) _, _ = s.BulkGet(ctx, []GetRequest{{}, {}, {}}, BulkGetOpts{})
expectBulkCount += 1 expectBulkCount += 1
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
s.BulkSet(context.Background(), []SetRequest{{}, {}, {}, {}})
s.BulkSet(ctx, []SetRequest{{}, {}, {}, {}}, BulkStoreOpts{})
expectBulkCount += 1 expectBulkCount += 1
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
s.BulkDelete(context.Background(), []DeleteRequest{{}, {}, {}, {}, {}})
s.BulkDelete(ctx, []DeleteRequest{{}, {}, {}, {}, {}}, BulkStoreOpts{})
expectBulkCount += 1 expectBulkCount += 1
require.Equal(t, expectCount, s.count) require.Equal(t, expectCount, s.count.Load())
require.Equal(t, expectBulkCount, s.bulkCount) require.Equal(t, expectBulkCount, s.bulkCount.Load())
}) })
} }
@ -136,8 +136,8 @@ var (
type storeBulk struct { type storeBulk struct {
BulkStore BulkStore
count int count atomic.Int32
bulkCount int bulkCount atomic.Int32
} }
func (s *storeBulk) Init(ctx context.Context, metadata Metadata) error { func (s *storeBulk) Init(ctx context.Context, metadata Metadata) error {
@ -145,17 +145,20 @@ func (s *storeBulk) Init(ctx context.Context, metadata Metadata) error {
} }
func (s *storeBulk) Delete(ctx context.Context, req *DeleteRequest) error { func (s *storeBulk) Delete(ctx context.Context, req *DeleteRequest) error {
s.count++ s.count.Add(1)
return nil return nil
} }
func (s *storeBulk) Get(ctx context.Context, req *GetRequest) (*GetResponse, error) { func (s *storeBulk) Get(ctx context.Context, req *GetRequest) (*GetResponse, error) {
s.count++ s.count.Add(1)
return &GetResponse{}, nil return &GetResponse{}, nil
} }
func (s *storeBulk) Set(ctx context.Context, req *SetRequest) error { func (s *storeBulk) Set(ctx context.Context, req *SetRequest) error {
s.count++ s.count.Add(1)
if strings.Contains(req.Key, "error-key") {
return errSimulated
}
return nil return nil
} }
@ -167,34 +170,22 @@ func (s *storeBulk) Features() []Feature {
return nil return nil
} }
// example of a transactional store which doesn't support native bulk methods
type storeBulkTransactional struct {
storeBulk
transactionalCount int
}
func (s *storeBulkTransactional) Multi(ctx context.Context, request *TransactionalStateRequest) error {
s.transactionalCount++
return nil
}
// example of a store which supports native bulk methods // example of a store which supports native bulk methods
type storeBulkNative struct { type storeBulkNative struct {
storeBulk storeBulk
} }
func (s *storeBulkNative) BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error) { func (s *storeBulkNative) BulkGet(ctx context.Context, req []GetRequest, opts BulkGetOpts) ([]BulkGetResponse, error) {
s.bulkCount++ s.bulkCount.Add(1)
return nil, nil return nil, nil
} }
func (s *storeBulkNative) BulkSet(ctx context.Context, req []SetRequest) error { func (s *storeBulkNative) BulkSet(ctx context.Context, req []SetRequest, _ BulkStoreOpts) error {
s.bulkCount++ s.bulkCount.Add(1)
return nil return nil
} }
func (s *storeBulkNative) BulkDelete(ctx context.Context, req []DeleteRequest) error { func (s *storeBulkNative) BulkDelete(ctx context.Context, req []DeleteRequest, _ BulkStoreOpts) error {
s.bulkCount++ s.bulkCount.Add(1)
return nil return nil
} }

View File

@ -576,7 +576,7 @@ func testBulkSetAndBulkDelete(t *testing.T, pgs *postgresql.PostgreSQL) {
}, },
} }
err := pgs.BulkSet(context.Background(), setReq) err := pgs.BulkSet(context.Background(), setReq, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, storeItemExists(t, setReq[0].Key)) assert.True(t, storeItemExists(t, setReq[0].Key))
assert.True(t, storeItemExists(t, setReq[1].Key)) assert.True(t, storeItemExists(t, setReq[1].Key))
@ -590,7 +590,7 @@ func testBulkSetAndBulkDelete(t *testing.T, pgs *postgresql.PostgreSQL) {
}, },
} }
err = pgs.BulkDelete(context.Background(), deleteReq) err = pgs.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
assert.False(t, storeItemExists(t, setReq[0].Key)) assert.False(t, storeItemExists(t, setReq[0].Key))
assert.False(t, storeItemExists(t, setReq[1].Key)) assert.False(t, storeItemExists(t, setReq[1].Key))

View File

@ -34,27 +34,6 @@ type ETagError struct {
kind ETagErrorKind kind ETagErrorKind
} }
func (e *ETagError) Kind() ETagErrorKind {
return e.kind
}
func (e *ETagError) Error() string {
var prefix string
switch e.kind {
case ETagInvalid:
prefix = invalidPrefix
case ETagMismatch:
prefix = mismatchPrefix
}
if e.err != nil {
return fmt.Sprintf("%s: %s", prefix, e.err)
}
return errors.New(prefix).Error()
}
// NewETagError returns an ETagError wrapping an existing context error. // NewETagError returns an ETagError wrapping an existing context error.
func NewETagError(kind ETagErrorKind, err error) *ETagError { func NewETagError(kind ETagErrorKind, err error) *ETagError {
return &ETagError{ return &ETagError{
@ -63,16 +42,36 @@ func NewETagError(kind ETagErrorKind, err error) *ETagError {
} }
} }
func (e *ETagError) Kind() ETagErrorKind {
return e.kind
}
func (e *ETagError) Error() string {
var prefix string
switch e.kind {
case ETagInvalid:
prefix = invalidPrefix
case ETagMismatch:
prefix = mismatchPrefix
}
if e.err != nil {
return prefix + ": " + e.err.Error()
}
return prefix
}
func (e *ETagError) Unwrap() error {
return e.err
}
// BulkDeleteRowMismatchError represents mismatch in rowcount while deleting rows. // BulkDeleteRowMismatchError represents mismatch in rowcount while deleting rows.
type BulkDeleteRowMismatchError struct { type BulkDeleteRowMismatchError struct {
expected uint64 expected uint64
affected uint64 affected uint64
} }
func (e *BulkDeleteRowMismatchError) Error() string {
return fmt.Sprintf("delete affected only %d rows, expected %d", e.affected, e.expected)
}
// BulkDeleteRowMismatchError returns a BulkDeleteRowMismatchError. // BulkDeleteRowMismatchError returns a BulkDeleteRowMismatchError.
func NewBulkDeleteRowMismatchError(expected, affected uint64) *BulkDeleteRowMismatchError { func NewBulkDeleteRowMismatchError(expected, affected uint64) *BulkDeleteRowMismatchError {
return &BulkDeleteRowMismatchError{ return &BulkDeleteRowMismatchError{
@ -80,3 +79,44 @@ func NewBulkDeleteRowMismatchError(expected, affected uint64) *BulkDeleteRowMism
affected: affected, affected: affected,
} }
} }
func (e *BulkDeleteRowMismatchError) Error() string {
return fmt.Sprintf("delete affected only %d rows, expected %d", e.affected, e.expected)
}
// BulkStoreError is an error object that contains details on the operations that failed.
type BulkStoreError struct {
key string
err error
}
func NewBulkStoreError(key string, err error) BulkStoreError {
return BulkStoreError{
key: key,
err: err,
}
}
// Key returns the key of the operation that failed.
func (e BulkStoreError) Key() string {
return e.key
}
// Error returns the error message. It implements the error interface.
func (e BulkStoreError) Error() string {
return e.err.Error()
}
// Unwrap returns the wrapped error. It implements the error wrapping interface.
func (e BulkStoreError) Unwrap() error {
return e.err
}
// ETagError returns an *ETagError if the wrapped error is of that kind; otherwise, returns nil
func (e BulkStoreError) ETagError() *ETagError {
var etagErr *ETagError
if errors.As(e.err, &etagErr) {
return etagErr
}
return nil
}

View File

@ -32,6 +32,8 @@ import (
) )
type inMemoryStore struct { type inMemoryStore struct {
state.BulkStore
items map[string]*inMemStateStoreItem items map[string]*inMemStateStoreItem
lock sync.RWMutex lock sync.RWMutex
log logger.Logger log logger.Logger
@ -45,11 +47,13 @@ func NewInMemoryStateStore(log logger.Logger) state.Store {
} }
func newStateStore(log logger.Logger) *inMemoryStore { func newStateStore(log logger.Logger) *inMemoryStore {
return &inMemoryStore{ s := &inMemoryStore{
items: map[string]*inMemStateStoreItem{}, items: map[string]*inMemStateStoreItem{},
log: log, log: log,
closeCh: make(chan struct{}), closeCh: make(chan struct{}),
} }
s.BulkStore = state.NewDefaultBulkStore(s)
return s
} }
func (store *inMemoryStore) Init(ctx context.Context, metadata state.Metadata) error { func (store *inMemoryStore) Init(ctx context.Context, metadata state.Metadata) error {
@ -138,37 +142,6 @@ func (store *inMemoryStore) doDelete(ctx context.Context, key string) {
delete(store.items, key) delete(store.items, key)
} }
func (store *inMemoryStore) BulkDelete(ctx context.Context, req []state.DeleteRequest) error {
if len(req) == 0 {
return nil
}
// step1: validate parameters
for i := 0; i < len(req); i++ {
if err := state.CheckRequestOptions(&req[i].Options); err != nil {
return err
}
}
// step2 and step3 should be protected by write-lock
store.lock.Lock()
defer store.lock.Unlock()
// step2: validate etag if needed
for _, dr := range req {
err := store.doValidateEtag(dr.Key, dr.ETag, dr.Options.Concurrency)
if err != nil {
return fmt.Errorf("etag mismatch for key %s", dr.Key)
}
}
// step3: do really delete
for _, dr := range req {
store.doDelete(ctx, dr.Key)
}
return nil
}
func (store *inMemoryStore) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) { func (store *inMemoryStore) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) {
store.lock.RLock() store.lock.RLock()
item := store.items[req.Key] item := store.items[req.Key]
@ -332,51 +305,6 @@ func (r innerSetRequest) GetMetadata() map[string]string {
return r.req.Metadata return r.req.Metadata
} }
func (store *inMemoryStore) BulkSet(ctx context.Context, req []state.SetRequest) error {
if len(req) == 0 {
return nil
}
// step1: validate parameters
innerSetRequestList := make([]*innerSetRequest, 0, len(req))
for i := 0; i < len(req); i++ {
ttlInSeconds, err := store.doSetValidateParameters(&req[i])
if err != nil {
return err
}
bt, err := store.marshal(req[i].Value)
if err != nil {
return err
}
innerSetRequest := &innerSetRequest{
req: req[i],
ttl: ttlInSeconds,
data: bt,
}
innerSetRequestList = append(innerSetRequestList, innerSetRequest)
}
// step2 and step3 should be protected by write-lock
store.lock.Lock()
defer store.lock.Unlock()
// step2: validate etag if needed
for _, dr := range req {
err := store.doValidateEtag(dr.Key, dr.ETag, dr.Options.Concurrency)
if err != nil {
return fmt.Errorf("etag mismatch for key %s", dr.Key)
}
}
// step3: do really set
// these operations won't fail
for _, innerSetRequest := range innerSetRequestList {
store.doSet(ctx, innerSetRequest.req.Key, innerSetRequest.data, innerSetRequest.ttl)
}
return nil
}
func (store *inMemoryStore) Multi(ctx context.Context, request *state.TransactionalStateRequest) error { func (store *inMemoryStore) Multi(ctx context.Context, request *state.TransactionalStateRequest) error {
if len(request.Operations) == 0 { if len(request.Operations) == 0 {
return nil return nil

View File

@ -102,7 +102,7 @@ func TestReadAndWrite(t *testing.T) {
}, { }, {
Key: "theSecondKey", Key: "theSecondKey",
Value: "84", Value: "84",
}}) }}, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
}) })

View File

@ -73,6 +73,8 @@ const (
// MongoDB is a state store implementation for MongoDB. // MongoDB is a state store implementation for MongoDB.
type MongoDB struct { type MongoDB struct {
state.BulkStore
client *mongo.Client client *mongo.Client
collection *mongo.Collection collection *mongo.Collection
operationTimeout time.Duration operationTimeout time.Duration
@ -106,10 +108,12 @@ type Item struct {
// NewMongoDB returns a new MongoDB state store. // NewMongoDB returns a new MongoDB state store.
func NewMongoDB(logger logger.Logger) state.Store { func NewMongoDB(logger logger.Logger) state.Store {
return &MongoDB{ s := &MongoDB{
features: []state.Feature{state.FeatureETag, state.FeatureTransactional, state.FeatureQueryAPI}, features: []state.Feature{state.FeatureETag, state.FeatureTransactional, state.FeatureQueryAPI},
logger: logger, logger: logger,
} }
s.BulkStore = state.NewDefaultBulkStore(s)
return s
} }
// Init establishes connection to the store based on the metadata. // Init establishes connection to the store based on the metadata.
@ -202,7 +206,7 @@ func (m *MongoDB) setInternal(ctx context.Context, req *state.SetRequest) error
// create a document based on request key and value // create a document based on request key and value
filter := bson.M{id: req.Key} filter := bson.M{id: req.Key}
if req.ETag != nil { if req.ETag != nil && *req.ETag != "" {
filter[etag] = *req.ETag filter[etag] = *req.ETag
} else if req.Options.Concurrency == state.FirstWrite { } else if req.Options.Concurrency == state.FirstWrite {
uuid, err := uuid.NewRandom() uuid, err := uuid.NewRandom()
@ -254,7 +258,10 @@ func (m *MongoDB) setInternal(ctx context.Context, req *state.SetRequest) error
_, err = m.collection.UpdateOne(ctx, filter, update, options.Update().SetUpsert(true)) _, err = m.collection.UpdateOne(ctx, filter, update, options.Update().SetUpsert(true))
if err != nil { if err != nil {
return fmt.Errorf("error in updating document: %s", err) if mongo.IsDuplicateKeyError(err) {
return state.NewETagError(state.ETagMismatch, err)
}
return fmt.Errorf("error in updating document: %w", err)
} }
return nil return nil
@ -420,7 +427,7 @@ func (m *MongoDB) Delete(ctx context.Context, req *state.DeleteRequest) error {
func (m *MongoDB) deleteInternal(ctx context.Context, req *state.DeleteRequest) error { func (m *MongoDB) deleteInternal(ctx context.Context, req *state.DeleteRequest) error {
filter := bson.M{id: req.Key} filter := bson.M{id: req.Key}
if req.ETag != nil { if req.ETag != nil && *req.ETag != "" {
filter[etag] = *req.ETag filter[etag] = *req.ETag
} }
result, err := m.collection.DeleteOne(ctx, filter) result, err := m.collection.DeleteOne(ctx, filter)
@ -428,55 +435,13 @@ func (m *MongoDB) deleteInternal(ctx context.Context, req *state.DeleteRequest)
return err return err
} }
if result.DeletedCount == 0 && req.ETag != nil { if result.DeletedCount == 0 && req.ETag != nil && *req.ETag != "" {
return errors.New("key or etag not found") return errors.New("key or etag not found")
} }
return nil return nil
} }
// BulkSet performs a bulk save operation.
// We need to implement a custom BulkSet/BulkDelete because with MongoDB transactions are not always available (only when connecting to a replica set), and when they're not, we need to fall back to performing operations in sequence.
func (m *MongoDB) BulkSet(ctx context.Context, req []state.SetRequest) error {
// Use transactions if we can
if m.isReplicaSet {
return m.Multi(ctx, &state.TransactionalStateRequest{
Operations: state.ToTransactionalStateOperationSlice(req),
})
}
// Fallback to executing all operations in sequence
for i := range req {
err := m.Set(ctx, &req[i])
if err != nil {
return err
}
}
return nil
}
// BulkDelete performs a bulk delete operation.
// We need to implement a custom BulkSet/BulkDelete because with MongoDB transactions are not always available (only when connecting to a replica set), and when they're not, we need to fall back to performing operations in sequence.
func (m *MongoDB) BulkDelete(ctx context.Context, req []state.DeleteRequest) error {
// Use transactions if we can
if m.isReplicaSet {
return m.Multi(ctx, &state.TransactionalStateRequest{
Operations: state.ToTransactionalStateOperationSlice(req),
})
}
// Fallback to executing all operations in sequence
for i := range req {
err := m.Delete(ctx, &req[i])
if err != nil {
return err
}
}
return nil
}
// Multi performs a transactional operation. succeeds only if all operations succeed, and fails if one or more operations fail. // Multi performs a transactional operation. succeeds only if all operations succeed, and fails if one or more operations fail.
func (m *MongoDB) Multi(ctx context.Context, request *state.TransactionalStateRequest) error { func (m *MongoDB) Multi(ctx context.Context, request *state.TransactionalStateRequest) error {
if !m.isReplicaSet { if !m.isReplicaSet {

View File

@ -73,6 +73,8 @@ const (
// MySQL state store. // MySQL state store.
type MySQL struct { type MySQL struct {
state.BulkStore
tableName string tableName string
metadataTableName string metadataTableName string
cleanupInterval *time.Duration cleanupInterval *time.Duration
@ -113,11 +115,13 @@ func NewMySQLStateStore(logger logger.Logger) state.Store {
func newMySQLStateStore(logger logger.Logger, factory iMySQLFactory) *MySQL { func newMySQLStateStore(logger logger.Logger, factory iMySQLFactory) *MySQL {
// Store the provided logger and return the object. The rest of the // Store the provided logger and return the object. The rest of the
// properties will be populated in the Init function // properties will be populated in the Init function
return &MySQL{ s := &MySQL{
logger: logger, logger: logger,
factory: factory, factory: factory,
timeout: 5 * time.Second, timeout: 5 * time.Second,
} }
s.BulkStore = state.NewDefaultBulkStore(s)
return s
} }
// Init initializes the SQL server state store // Init initializes the SQL server state store
@ -517,32 +521,6 @@ func (m *MySQL) deleteValue(parentCtx context.Context, querier querier, req *sta
return nil return nil
} }
// BulkDelete removes multiple entries from the store
// Store Interface.
func (m *MySQL) BulkDelete(ctx context.Context, req []state.DeleteRequest) error {
tx, err := m.db.Begin()
if err != nil {
return err
}
defer func() {
rollbackErr := tx.Rollback()
if rollbackErr != nil && !errors.Is(rollbackErr, sql.ErrTxDone) {
m.logger.Errorf("Error rolling back transaction: %v", rollbackErr)
}
}()
if len(req) > 0 {
for i := range req {
err = m.deleteValue(ctx, tx, &req[i])
if err != nil {
return err
}
}
}
return tx.Commit()
}
// Get returns an entity from store // Get returns an entity from store
// Store Interface. // Store Interface.
func (m *MySQL) Get(parentCtx context.Context, req *state.GetRequest) (*state.GetResponse, error) { func (m *MySQL) Get(parentCtx context.Context, req *state.GetRequest) (*state.GetResponse, error) {
@ -566,7 +544,7 @@ func (m *MySQL) Get(parentCtx context.Context, req *state.GetRequest) (*state.Ge
} }
return &state.GetResponse{ return &state.GetResponse{
Data: value, Data: value,
ETag: &etag, ETag: etag,
Metadata: req.Metadata, Metadata: req.Metadata,
}, nil }, nil
} }
@ -741,29 +719,28 @@ func (m *MySQL) BulkGet(parentCtx context.Context, req []state.GetRequest, _ sta
return nil, err return nil, err
} }
var ( var n int
n int
etag string
)
res := make([]state.BulkGetResponse, len(req)) res := make([]state.BulkGetResponse, len(req))
for ; rows.Next(); n++ { for ; rows.Next(); n++ {
r := state.BulkGetResponse{} r := state.BulkGetResponse{}
r.Key, r.Data, etag, err = readRow(rows) r.Key, r.Data, r.ETag, err = readRow(rows)
if err != nil { if err != nil {
r.Error = err.Error() r.Error = err.Error()
} }
r.ETag = &etag
res[n] = r res[n] = r
} }
return res[:n], nil return res[:n], nil
} }
func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte, etag string, err error) { func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte, etagP *string, err error) {
var isBinary bool var (
etag string
isBinary bool
)
err = row.Scan(&key, &value, &etag, &isBinary) err = row.Scan(&key, &value, &etag, &isBinary)
if err != nil { if err != nil {
return key, nil, "", err return key, nil, nil, err
} }
if isBinary { if isBinary {
@ -774,43 +751,17 @@ func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte
err = json.Unmarshal(value, &s) err = json.Unmarshal(value, &s)
if err != nil { if err != nil {
return key, nil, "", fmt.Errorf("failed to unmarshal JSON binary data: %w", err) return key, nil, nil, fmt.Errorf("failed to unmarshal JSON binary data: %w", err)
} }
data, err = base64.StdEncoding.DecodeString(s) data, err = base64.StdEncoding.DecodeString(s)
if err != nil { if err != nil {
return key, nil, "", fmt.Errorf("failed to decode binary data: %w", err) return key, nil, nil, fmt.Errorf("failed to decode binary data: %w", err)
} }
return key, data, etag, nil return key, data, &etag, nil
} }
return key, value, etag, nil return key, value, &etag, nil
}
// BulkSet adds/updates multiple entities on store
// Store Interface.
func (m *MySQL) BulkSet(ctx context.Context, req []state.SetRequest) error {
tx, err := m.db.Begin()
if err != nil {
return err
}
defer func() {
rollbackErr := tx.Rollback()
if rollbackErr != nil && !errors.Is(rollbackErr, sql.ErrTxDone) {
m.logger.Errorf("Error rolling back transaction: %v", rollbackErr)
}
}()
if len(req) > 0 {
for i := range req {
err = m.setValue(ctx, tx, &req[i])
if err != nil {
return err
}
}
}
return tx.Commit()
} }
// Multi handles multiple transactions. // Multi handles multiple transactions.

View File

@ -552,7 +552,7 @@ func testBulkSetAndBulkDelete(t *testing.T, mys *MySQL) {
}, },
} }
err := mys.BulkSet(context.Background(), setReq) err := mys.BulkSet(context.Background(), setReq, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, storeItemExists(t, setReq[0].Key)) assert.True(t, storeItemExists(t, setReq[0].Key))
assert.True(t, storeItemExists(t, setReq[1].Key)) assert.True(t, storeItemExists(t, setReq[1].Key))
@ -566,7 +566,7 @@ func testBulkSetAndBulkDelete(t *testing.T, mys *MySQL) {
}, },
} }
err = mys.BulkDelete(context.Background(), deleteReq) err = mys.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
assert.False(t, storeItemExists(t, setReq[0].Key)) assert.False(t, storeItemExists(t, setReq[0].Key))
assert.False(t, storeItemExists(t, setReq[1].Key)) assert.False(t, storeItemExists(t, setReq[1].Key))

View File

@ -174,44 +174,6 @@ func TestExecuteMultiCannotBeginTransaction(t *testing.T) {
assert.Equal(t, "beginError", err.Error(), "wrong error returned") assert.Equal(t, "beginError", err.Error(), "wrong error returned")
} }
func TestMySQLBulkDeleteRollbackDeletes(t *testing.T) {
// Arrange
m, _ := mockDatabase(t)
defer m.mySQL.Close()
m.mock1.ExpectBegin()
m.mock1.ExpectExec("DELETE FROM").WillReturnError(fmt.Errorf("deleteError"))
m.mock1.ExpectRollback()
deletes := []state.DeleteRequest{createDeleteRequest()}
// Act
err := m.mySQL.BulkDelete(context.Background(), deletes)
// Assert
assert.NotNil(t, err, "no error returned")
assert.Equal(t, "deleteError", err.Error(), "wrong error returned")
}
func TestMySQLBulkSetRollbackSets(t *testing.T) {
// Arrange
m, _ := mockDatabase(t)
defer m.mySQL.Close()
m.mock1.ExpectBegin()
m.mock1.ExpectExec("INSERT INTO").WillReturnError(fmt.Errorf("setError"))
m.mock1.ExpectRollback()
sets := []state.SetRequest{createSetRequest()}
// Act
err := m.mySQL.BulkSet(context.Background(), sets)
// Assert
assert.NotNil(t, err, "no error returned")
assert.Equal(t, "setError", err.Error(), "wrong error returned")
}
func TestExecuteMultiCommitSetsAndDeletes(t *testing.T) { func TestExecuteMultiCommitSetsAndDeletes(t *testing.T) {
// Arrange // Arrange
m, _ := mockDatabase(t) m, _ := mockDatabase(t)

View File

@ -618,7 +618,7 @@ func testBulkSetAndBulkDelete(t *testing.T, ods state.Store) {
}, },
} }
err := ods.BulkSet(context.Background(), setReq) err := ods.BulkSet(context.Background(), setReq, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
assert.True(t, storeItemExists(t, db, setReq[0].Key)) assert.True(t, storeItemExists(t, db, setReq[0].Key))
assert.True(t, storeItemExists(t, db, setReq[1].Key)) assert.True(t, storeItemExists(t, db, setReq[1].Key))
@ -632,7 +632,7 @@ func testBulkSetAndBulkDelete(t *testing.T, ods state.Store) {
}, },
} }
err = ods.BulkDelete(context.Background(), deleteReq) err = ods.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
assert.False(t, storeItemExists(t, db, setReq[0].Key)) assert.False(t, storeItemExists(t, db, setReq[0].Key))
assert.False(t, storeItemExists(t, db, setReq[1].Key)) assert.False(t, storeItemExists(t, db, setReq[1].Key))

View File

@ -194,9 +194,6 @@ func (o *oracleDatabaseAccess) doSet(ctx context.Context, db querier, req *state
result, err = db.ExecContext(ctx, updateStatement, value, binaryYN, etag, req.Key, *req.ETag) result, err = db.ExecContext(ctx, updateStatement, value, binaryYN, etag, req.Key, *req.ETag)
} }
if err != nil { if err != nil {
if req.ETag != nil && *req.ETag != "" {
return state.NewETagError(state.ETagMismatch, err)
}
return err return err
} }
rows, err := result.RowsAffected() rows, err := result.RowsAffected()
@ -204,6 +201,9 @@ func (o *oracleDatabaseAccess) doSet(ctx context.Context, db querier, req *state
return err return err
} }
if rows != 1 { if rows != 1 {
if req.ETag != nil && *req.ETag != "" {
return state.NewETagError(state.ETagMismatch, err)
}
return errors.New("no item was updated") return errors.New("no item was updated")
} }
return nil return nil

View File

@ -412,7 +412,7 @@ func testBulkSetAndBulkDelete(t *testing.T, pgs *postgresql.PostgreSQL) {
}, },
} }
err := pgs.BulkSet(context.Background(), setReq) err := pgs.BulkSet(context.Background(), setReq, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, storeItemExists(t, setReq[0].Key)) assert.True(t, storeItemExists(t, setReq[0].Key))
assert.True(t, storeItemExists(t, setReq[1].Key)) assert.True(t, storeItemExists(t, setReq[1].Key))
@ -426,7 +426,7 @@ func testBulkSetAndBulkDelete(t *testing.T, pgs *postgresql.PostgreSQL) {
}, },
} }
err = pgs.BulkDelete(context.Background(), deleteReq) err = pgs.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
assert.False(t, storeItemExists(t, setReq[0].Key)) assert.False(t, storeItemExists(t, setReq[0].Key))
assert.False(t, storeItemExists(t, setReq[1].Key)) assert.False(t, storeItemExists(t, setReq[1].Key))

View File

@ -39,8 +39,6 @@ const (
// RethinkDB is a state store implementation with transactional support for RethinkDB. // RethinkDB is a state store implementation with transactional support for RethinkDB.
type RethinkDB struct { type RethinkDB struct {
state.BulkStore
session *r.Session session *r.Session
config *stateConfig config *stateConfig
features []state.Feature features []state.Feature
@ -66,7 +64,6 @@ func NewRethinkDBStateStore(logger logger.Logger) state.Store {
features: []state.Feature{}, features: []state.Feature{},
logger: logger, logger: logger,
} }
s.BulkStore = state.NewDefaultBulkStore(s)
return s return s
} }
@ -201,17 +198,21 @@ func (s *RethinkDB) Get(ctx context.Context, req *state.GetRequest) (*state.GetR
return resp, nil return resp, nil
} }
func (s *RethinkDB) BulkGet(ctx context.Context, req []state.GetRequest, opts state.BulkGetOpts) ([]state.BulkGetResponse, error) {
return state.DoBulkGet(ctx, req, opts, s.Get)
}
// Set saves a state KV item. // Set saves a state KV item.
func (s *RethinkDB) Set(ctx context.Context, req *state.SetRequest) error { func (s *RethinkDB) Set(ctx context.Context, req *state.SetRequest) error {
if req == nil || req.Key == "" || req.Value == nil { if req == nil || req.Key == "" || req.Value == nil {
return errors.New("invalid state request, key and value required") return errors.New("invalid state request, key and value required")
} }
return s.BulkSet(ctx, []state.SetRequest{*req}) return s.BulkSet(ctx, []state.SetRequest{*req}, state.BulkStoreOpts{})
} }
// BulkSet performs a bulk save operation. // BulkSet performs a bulk save operation.
func (s *RethinkDB) BulkSet(ctx context.Context, req []state.SetRequest) error { func (s *RethinkDB) BulkSet(ctx context.Context, req []state.SetRequest, _ state.BulkStoreOpts) error {
docs := make([]*stateRecord, len(req)) docs := make([]*stateRecord, len(req))
now := time.Now().UnixNano() now := time.Now().UnixNano()
for i, v := range req { for i, v := range req {
@ -272,11 +273,11 @@ func (s *RethinkDB) Delete(ctx context.Context, req *state.DeleteRequest) error
return errors.New("invalid request, missing key") return errors.New("invalid request, missing key")
} }
return s.BulkDelete(ctx, []state.DeleteRequest{*req}) return s.BulkDelete(ctx, []state.DeleteRequest{*req}, state.BulkStoreOpts{})
} }
// BulkDelete performs a bulk delete operation. // BulkDelete performs a bulk delete operation.
func (s *RethinkDB) BulkDelete(ctx context.Context, req []state.DeleteRequest) error { func (s *RethinkDB) BulkDelete(ctx context.Context, req []state.DeleteRequest, _ state.BulkStoreOpts) error {
list := make([]string, len(req)) list := make([]string, len(req))
for i, d := range req { for i, d := range req {
list[i] = d.Key list[i] = d.Key

View File

@ -23,6 +23,7 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/dapr/components-contrib/internal/utils"
"github.com/dapr/components-contrib/metadata" "github.com/dapr/components-contrib/metadata"
"github.com/dapr/components-contrib/state" "github.com/dapr/components-contrib/state"
"github.com/dapr/kit/logger" "github.com/dapr/kit/logger"
@ -148,7 +149,6 @@ func TestRethinkDBStateStore(t *testing.T) {
}) })
t.Run("With bulk", func(t *testing.T) { t.Run("With bulk", func(t *testing.T) {
db.BulkStore = state.NewDefaultBulkStore(db)
testBulk(t, db, 0) testBulk(t, db, 0)
}) })
} }
@ -181,7 +181,7 @@ func testBulk(t *testing.T, db state.Store, i int) {
} }
// bulk set it // bulk set it
if err := db.BulkSet(context.Background(), setList); err != nil { if err := db.BulkSet(context.Background(), setList, state.BulkStoreOpts{}); err != nil {
t.Fatalf("error setting data to db: %v -- run %d", err, i) t.Fatalf("error setting data to db: %v -- run %d", err, i)
} }
@ -194,7 +194,7 @@ func testBulk(t *testing.T, db state.Store, i int) {
} }
// delete data // delete data
if err := db.BulkDelete(context.Background(), deleteList); err != nil { if err := db.BulkDelete(context.Background(), deleteList, state.BulkStoreOpts{}); err != nil {
t.Fatalf("error on data deletion: %v -- run %d", err, i) t.Fatalf("error on data deletion: %v -- run %d", err, i)
} }
@ -227,7 +227,7 @@ func testGetTestObj(t *testing.T, resp *state.GetResponse) *testObj {
} }
func isLiveTest() bool { func isLiveTest() bool {
return os.Getenv("RUN_LIVE_RETHINKDB_TEST") == "true" return utils.IsTruthy(os.Getenv("RUN_LIVE_RETHINKDB_TEST"))
} }
func getTestMetadata() map[string]string { func getTestMetadata() map[string]string {

View File

@ -267,7 +267,7 @@ func (a *sqliteDBAccess) Get(parentCtx context.Context, req *state.GetRequest) (
return &state.GetResponse{ return &state.GetResponse{
Data: value, Data: value,
ETag: &etag, ETag: etag,
Metadata: req.Metadata, Metadata: req.Metadata,
}, nil }, nil
} }
@ -297,29 +297,28 @@ func (a *sqliteDBAccess) BulkGet(parentCtx context.Context, req []state.GetReque
return nil, err return nil, err
} }
var ( var n int
n int
etag string
)
res := make([]state.BulkGetResponse, len(req)) res := make([]state.BulkGetResponse, len(req))
for ; rows.Next(); n++ { for ; rows.Next(); n++ {
r := state.BulkGetResponse{} r := state.BulkGetResponse{}
r.Key, r.Data, etag, err = readRow(rows) r.Key, r.Data, r.ETag, err = readRow(rows)
if err != nil { if err != nil {
r.Error = err.Error() r.Error = err.Error()
} }
r.ETag = &etag
res[n] = r res[n] = r
} }
return res[:n], nil return res[:n], nil
} }
func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte, etag string, err error) { func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte, etagP *string, err error) {
var isBinary bool var (
isBinary bool
etag string
)
err = row.Scan(&key, &value, &isBinary, &etag) err = row.Scan(&key, &value, &isBinary, &etag)
if err != nil { if err != nil {
return key, nil, "", err return key, nil, nil, err
} }
if isBinary { if isBinary {
@ -327,12 +326,12 @@ func readRow(row interface{ Scan(dest ...any) error }) (key string, value []byte
data := make([]byte, len(value)) data := make([]byte, len(value))
n, err = base64.StdEncoding.Decode(data, value) n, err = base64.StdEncoding.Decode(data, value)
if err != nil { if err != nil {
return key, nil, "", fmt.Errorf("failed to decode binary data: %w", err) return key, nil, nil, fmt.Errorf("failed to decode binary data: %w", err)
} }
return key, data[:n], etag, nil return key, data[:n], &etag, nil
} }
return key, value, etag, nil return key, value, &etag, nil
} }
func (a *sqliteDBAccess) Set(ctx context.Context, req *state.SetRequest) error { func (a *sqliteDBAccess) Set(ctx context.Context, req *state.SetRequest) error {

View File

@ -582,7 +582,7 @@ func testBulkSetAndBulkDelete(t *testing.T, s state.Store) {
}, },
} }
err := s.BulkSet(context.Background(), setReq) err := s.BulkSet(context.Background(), setReq, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
assert.True(t, storeItemExists(t, s, setReq[0].Key)) assert.True(t, storeItemExists(t, s, setReq[0].Key))
assert.True(t, storeItemExists(t, s, setReq[1].Key)) assert.True(t, storeItemExists(t, s, setReq[1].Key))
@ -596,7 +596,7 @@ func testBulkSetAndBulkDelete(t *testing.T, s state.Store) {
}, },
} }
err = s.BulkDelete(context.Background(), deleteReq) err = s.BulkDelete(context.Background(), deleteReq, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
assert.False(t, storeItemExists(t, s, setReq[0].Key)) assert.False(t, storeItemExists(t, s, setReq[0].Key))
assert.False(t, storeItemExists(t, s, setReq[1].Key)) assert.False(t, storeItemExists(t, s, setReq[1].Key))

View File

@ -28,8 +28,6 @@ type migration struct {
} }
type migrationResult struct { type migrationResult struct {
bulkDeleteProcName string
bulkDeleteProcFullName string
itemRefTableTypeName string itemRefTableTypeName string
upsertProcName string upsertProcName string
upsertProcFullName string upsertProcFullName string
@ -47,7 +45,6 @@ func newMigration(metadata *sqlServerMetadata) migrator {
func (m *migration) newMigrationResult() migrationResult { func (m *migration) newMigrationResult() migrationResult {
r := migrationResult{ r := migrationResult{
bulkDeleteProcName: fmt.Sprintf("sp_BulkDelete_%s", m.metadata.TableName),
itemRefTableTypeName: fmt.Sprintf("[%s].%s_Table", m.metadata.Schema, m.metadata.TableName), itemRefTableTypeName: fmt.Sprintf("[%s].%s_Table", m.metadata.Schema, m.metadata.TableName),
upsertProcName: fmt.Sprintf("sp_Upsert_v3_%s", m.metadata.TableName), upsertProcName: fmt.Sprintf("sp_Upsert_v3_%s", m.metadata.TableName),
getCommand: fmt.Sprintf("SELECT [Data], [RowVersion] FROM [%s].[%s] WHERE [Key] = @Key AND ([ExpireDate] IS NULL OR [ExpireDate] > GETDATE())", m.metadata.Schema, m.metadata.TableName), getCommand: fmt.Sprintf("SELECT [Data], [RowVersion] FROM [%s].[%s] WHERE [Key] = @Key AND ([ExpireDate] IS NULL OR [ExpireDate] > GETDATE())", m.metadata.Schema, m.metadata.TableName),
@ -55,7 +52,6 @@ func (m *migration) newMigrationResult() migrationResult {
deleteWithoutETagCommand: fmt.Sprintf(`DELETE [%s].[%s] WHERE [Key]=@Key`, m.metadata.Schema, m.metadata.TableName), deleteWithoutETagCommand: fmt.Sprintf(`DELETE [%s].[%s] WHERE [Key]=@Key`, m.metadata.Schema, m.metadata.TableName),
} }
r.bulkDeleteProcFullName = fmt.Sprintf("[%s].%s", m.metadata.Schema, r.bulkDeleteProcName)
r.upsertProcFullName = fmt.Sprintf("[%s].%s", m.metadata.Schema, r.upsertProcName) r.upsertProcFullName = fmt.Sprintf("[%s].%s", m.metadata.Schema, r.upsertProcName)
//nolint:exhaustive //nolint:exhaustive
@ -248,36 +244,12 @@ func (m *migration) ensureTypeExists(ctx context.Context, db *sql.DB, mr migrati
return runCommand(ctx, db, tsql) return runCommand(ctx, db, tsql)
} }
/* #nosec. */
func (m *migration) ensureBulkDeleteStoredProcedureExists(ctx context.Context, db *sql.DB, mr migrationResult) error {
tsql := fmt.Sprintf(`
CREATE PROCEDURE %s
@itemsToDelete %s READONLY
AS
DELETE [%s].[%s]
FROM [%s].[%s] x
JOIN @itemsToDelete i ON i.[Key] = x.[Key] AND (i.[RowVersion] IS NULL OR i.[RowVersion] = x.[RowVersion])`,
mr.bulkDeleteProcFullName,
mr.itemRefTableTypeName,
m.metadata.Schema,
m.metadata.TableName,
m.metadata.Schema,
m.metadata.TableName)
return m.createStoredProcedureIfNotExists(ctx, db, mr.bulkDeleteProcName, tsql)
}
func (m *migration) ensureStoredProcedureExists(ctx context.Context, db *sql.DB, mr migrationResult) error { func (m *migration) ensureStoredProcedureExists(ctx context.Context, db *sql.DB, mr migrationResult) error {
err := m.ensureTypeExists(ctx, db, mr) err := m.ensureTypeExists(ctx, db, mr)
if err != nil { if err != nil {
return err return err
} }
err = m.ensureBulkDeleteStoredProcedureExists(ctx, db, mr)
if err != nil {
return err
}
err = m.ensureUpsertStoredProcedureExists(ctx, db, mr) err = m.ensureUpsertStoredProcedureExists(ctx, db, mr)
if err != nil { if err != nil {
return err return err

View File

@ -22,8 +22,6 @@ import (
"fmt" "fmt"
"time" "time"
mssql "github.com/microsoft/go-mssqldb"
internalsql "github.com/dapr/components-contrib/internal/component/sql" internalsql "github.com/dapr/components-contrib/internal/component/sql"
"github.com/dapr/components-contrib/state" "github.com/dapr/components-contrib/state"
"github.com/dapr/components-contrib/state/utils" "github.com/dapr/components-contrib/state/utils"
@ -88,7 +86,6 @@ type SQLServer struct {
migratorFactory func(*sqlServerMetadata) migrator migratorFactory func(*sqlServerMetadata) migrator
bulkDeleteCommand string
itemRefTableTypeName string itemRefTableTypeName string
upsertCommand string upsertCommand string
getCommand string getCommand string
@ -116,7 +113,6 @@ func (s *SQLServer) Init(ctx context.Context, metadata state.Metadata) error {
} }
s.itemRefTableTypeName = mr.itemRefTableTypeName s.itemRefTableTypeName = mr.itemRefTableTypeName
s.bulkDeleteCommand = fmt.Sprintf("exec %s @itemsToDelete;", mr.bulkDeleteProcFullName)
s.upsertCommand = mr.upsertProcFullName s.upsertCommand = mr.upsertProcFullName
s.getCommand = mr.getCommand s.getCommand = mr.getCommand
s.deleteWithETagCommand = mr.deleteWithETagCommand s.deleteWithETagCommand = mr.deleteWithETagCommand
@ -246,58 +242,6 @@ type TvpDeleteTableStringKey struct {
RowVersion []byte RowVersion []byte
} }
// BulkDelete removes multiple entries from the store.
func (s *SQLServer) BulkDelete(ctx context.Context, req []state.DeleteRequest) error {
tx, err := s.db.BeginTx(ctx, nil)
defer tx.Rollback()
if err != nil {
return err
}
err = s.executeBulkDelete(ctx, tx, req)
if err != nil {
return err
}
return tx.Commit()
}
func (s *SQLServer) executeBulkDelete(ctx context.Context, db dbExecutor, req []state.DeleteRequest) error {
values := make([]TvpDeleteTableStringKey, len(req))
for i, d := range req {
var etag []byte
var err error
if d.ETag != nil {
etag, err = hex.DecodeString(*d.ETag)
if err != nil {
return state.NewETagError(state.ETagInvalid, err)
}
}
values[i] = TvpDeleteTableStringKey{ID: d.Key, RowVersion: etag}
}
itemsToDelete := mssql.TVP{
TypeName: s.itemRefTableTypeName,
Value: values,
}
res, err := db.ExecContext(ctx, s.bulkDeleteCommand, sql.Named("itemsToDelete", itemsToDelete))
if err != nil {
return err
}
rows, err := res.RowsAffected()
if err != nil {
return err
}
if int(rows) != len(req) {
return state.NewBulkDeleteRowMismatchError(uint64(rows), uint64(len(req)))
}
return nil
}
// Get returns an entity from store. // Get returns an entity from store.
func (s *SQLServer) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) { func (s *SQLServer) Get(ctx context.Context, req *state.GetRequest) (*state.GetResponse, error) {
rows, err := s.db.QueryContext(ctx, s.getCommand, sql.Named(keyColumnName, req.Key)) rows, err := s.db.QueryContext(ctx, s.getCommand, sql.Named(keyColumnName, req.Key))
@ -374,10 +318,6 @@ func (s *SQLServer) executeSet(ctx context.Context, db dbExecutor, req *state.Se
} }
if err != nil { if err != nil {
if req.ETag != nil && *req.ETag != "" {
return state.NewETagError(state.ETagMismatch, err)
}
return err return err
} }
@ -387,30 +327,15 @@ func (s *SQLServer) executeSet(ctx context.Context, db dbExecutor, req *state.Se
} }
if rows != 1 { if rows != 1 {
if req.ETag != nil && *req.ETag != "" {
return state.NewETagError(state.ETagMismatch, err)
}
return errors.New("no item was updated") return errors.New("no item was updated")
} }
return nil return nil
} }
// BulkSet adds/updates multiple entities on store.
func (s *SQLServer) BulkSet(ctx context.Context, req []state.SetRequest) error {
tx, err := s.db.BeginTx(ctx, nil)
defer tx.Rollback()
if err != nil {
return err
}
for i := range req {
err = s.executeSet(ctx, tx, &req[i])
if err != nil {
return err
}
}
return tx.Commit()
}
func (s *SQLServer) GetComponentMetadata() map[string]string { func (s *SQLServer) GetComponentMetadata() map[string]string {
return map[string]string{} return map[string]string{}
} }

View File

@ -290,7 +290,7 @@ func testIndexedProperties(t *testing.T) {
{Key: "2", Value: userWithPets{user{"2", "Laura", "Water"}, 1}}, {Key: "2", Value: userWithPets{user{"2", "Laura", "Water"}, 1}},
{Key: "3", Value: userWithPets{user{"3", "Carl", "Beer"}, 0}}, {Key: "3", Value: userWithPets{user{"3", "Carl", "Beer"}, 0}},
{Key: "4", Value: userWithPets{user{"4", "Maria", "Wine"}, 100}}, {Key: "4", Value: userWithPets{user{"4", "Maria", "Wine"}, 100}},
}) }, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
@ -347,7 +347,7 @@ func testMultiOperations(t *testing.T) {
bulkSet[i] = state.SetRequest{Key: u.ID, Value: u} bulkSet[i] = state.SetRequest{Key: u.ID, Value: u}
} }
err := store.BulkSet(context.Background(), bulkSet) err := store.BulkSet(context.Background(), bulkSet, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
assertUserCountIsEqualTo(t, store, len(initialUsers)) assertUserCountIsEqualTo(t, store, len(initialUsers))
@ -524,7 +524,7 @@ func testBulkSet(t *testing.T) {
sets[i] = state.SetRequest{Key: u.ID, Value: u} sets[i] = state.SetRequest{Key: u.ID, Value: u}
} }
err := store.BulkSet(context.Background(), sets) err := store.BulkSet(context.Background(), sets, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
totalUsers = len(sets) totalUsers = len(sets)
assertUserCountIsEqualTo(t, store, totalUsers) assertUserCountIsEqualTo(t, store, totalUsers)
@ -539,7 +539,7 @@ func testBulkSet(t *testing.T) {
err := store.BulkSet(context.Background(), []state.SetRequest{ err := store.BulkSet(context.Background(), []state.SetRequest{
{Key: modified.ID, Value: modified, ETag: &toModifyETag}, {Key: modified.ID, Value: modified, ETag: &toModifyETag},
{Key: toInsert.ID, Value: toInsert}, {Key: toInsert.ID, Value: toInsert},
}) }, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
assertLoadedUserIsEqual(t, store, modified.ID, modified) assertLoadedUserIsEqual(t, store, modified.ID, modified)
assertLoadedUserIsEqual(t, store, toInsert.ID, toInsert) assertLoadedUserIsEqual(t, store, toInsert.ID, toInsert)
@ -558,7 +558,7 @@ func testBulkSet(t *testing.T) {
err := store.BulkSet(context.Background(), []state.SetRequest{ err := store.BulkSet(context.Background(), []state.SetRequest{
{Key: modified.ID, Value: modified}, {Key: modified.ID, Value: modified},
{Key: toInsert.ID, Value: toInsert}, {Key: toInsert.ID, Value: toInsert},
}) }, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
assertLoadedUserIsEqual(t, store, modified.ID, modified) assertLoadedUserIsEqual(t, store, modified.ID, modified)
assertLoadedUserIsEqual(t, store, toInsert.ID, toInsert) assertLoadedUserIsEqual(t, store, toInsert.ID, toInsert)
@ -582,7 +582,7 @@ func testBulkSet(t *testing.T) {
{Key: modified.ID, Value: modified, ETag: &invEtag}, {Key: modified.ID, Value: modified, ETag: &invEtag},
} }
err := store.BulkSet(context.Background(), sets) err := store.BulkSet(context.Background(), sets, state.BulkStoreOpts{})
assert.NotNil(t, err) assert.NotNil(t, err)
assertUserCountIsEqualTo(t, store, totalUsers) assertUserCountIsEqualTo(t, store, totalUsers)
assertUserDoesNotExist(t, store, toInsert1.ID) assertUserDoesNotExist(t, store, toInsert1.ID)
@ -625,7 +625,7 @@ func testBulkDelete(t *testing.T) {
for i, u := range initialUsers { for i, u := range initialUsers {
sets[i] = state.SetRequest{Key: u.ID, Value: u} sets[i] = state.SetRequest{Key: u.ID, Value: u}
} }
err := store.BulkSet(context.Background(), sets) err := store.BulkSet(context.Background(), sets, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
totalUsers := len(initialUsers) totalUsers := len(initialUsers)
assertUserCountIsEqualTo(t, store, totalUsers) assertUserCountIsEqualTo(t, store, totalUsers)
@ -638,7 +638,7 @@ func testBulkDelete(t *testing.T) {
err := store.BulkDelete(context.Background(), []state.DeleteRequest{ err := store.BulkDelete(context.Background(), []state.DeleteRequest{
{Key: deleted1}, {Key: deleted1},
{Key: deleted2}, {Key: deleted2},
}) }, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
totalUsers -= 2 totalUsers -= 2
assertUserCountIsEqualTo(t, store, totalUsers) assertUserCountIsEqualTo(t, store, totalUsers)
@ -655,7 +655,7 @@ func testBulkDelete(t *testing.T) {
err := store.BulkDelete(context.Background(), []state.DeleteRequest{ err := store.BulkDelete(context.Background(), []state.DeleteRequest{
{Key: deleted1.ID, ETag: &deleted1Etag}, {Key: deleted1.ID, ETag: &deleted1Etag},
{Key: deleted2.ID, ETag: &deleted2Etag}, {Key: deleted2.ID, ETag: &deleted2Etag},
}) }, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
totalUsers -= 2 totalUsers -= 2
assertUserCountIsEqualTo(t, store, totalUsers) assertUserCountIsEqualTo(t, store, totalUsers)
@ -672,7 +672,7 @@ func testBulkDelete(t *testing.T) {
err := store.BulkDelete(context.Background(), []state.DeleteRequest{ err := store.BulkDelete(context.Background(), []state.DeleteRequest{
{Key: deleted1.ID, ETag: &deleted1Etag}, {Key: deleted1.ID, ETag: &deleted1Etag},
{Key: deleted2.ID}, {Key: deleted2.ID},
}) }, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
totalUsers -= 2 totalUsers -= 2
assertUserCountIsEqualTo(t, store, totalUsers) assertUserCountIsEqualTo(t, store, totalUsers)
@ -690,7 +690,7 @@ func testBulkDelete(t *testing.T) {
err := store.BulkDelete(context.Background(), []state.DeleteRequest{ err := store.BulkDelete(context.Background(), []state.DeleteRequest{
{Key: deleted1.ID, ETag: &deleted1Etag}, {Key: deleted1.ID, ETag: &deleted1Etag},
{Key: deleted2.ID, ETag: &invEtag}, {Key: deleted2.ID, ETag: &invEtag},
}) }, state.BulkStoreOpts{})
assert.NotNil(t, err) assert.NotNil(t, err)
assert.NotNil(t, err) assert.NotNil(t, err)
assertUserCountIsEqualTo(t, store, totalUsers) assertUserCountIsEqualTo(t, store, totalUsers)

View File

@ -23,7 +23,6 @@ import (
"time" "time"
"github.com/go-zookeeper/zk" "github.com/go-zookeeper/zk"
"github.com/hashicorp/go-multierror"
jsoniter "github.com/json-iterator/go" jsoniter "github.com/json-iterator/go"
"github.com/dapr/components-contrib/metadata" "github.com/dapr/components-contrib/metadata"
@ -197,33 +196,6 @@ func (s *StateStore) Delete(ctx context.Context, req *state.DeleteRequest) error
return nil return nil
} }
// BulkDelete performs a bulk delete operation.
func (s *StateStore) BulkDelete(ctx context.Context, reqs []state.DeleteRequest) error {
ops := make([]any, 0, len(reqs))
for i := range reqs {
req, err := s.newDeleteRequest(&reqs[i])
if err != nil {
return err
}
ops = append(ops, req)
}
res, err := s.conn.Multi(ops...)
if err != nil {
return err
}
for _, res := range res {
if res.Error != nil && !errors.Is(res.Error, zk.ErrNoNode) {
err = multierror.Append(err, res.Error)
}
}
return err
}
// Set saves state into Zookeeper. // Set saves state into Zookeeper.
func (s *StateStore) Set(ctx context.Context, req *state.SetRequest) error { func (s *StateStore) Set(ctx context.Context, req *state.SetRequest) error {
r, err := s.newSetDataRequest(req) r, err := s.newSetDataRequest(req)
@ -247,52 +219,6 @@ func (s *StateStore) Set(ctx context.Context, req *state.SetRequest) error {
return nil return nil
} }
// BulkSet performs a bulks save operation.
func (s *StateStore) BulkSet(ctx context.Context, reqs []state.SetRequest) error {
ops := make([]any, 0, len(reqs))
for i := range reqs {
req, err := s.newSetDataRequest(&reqs[i])
if err != nil {
return err
}
ops = append(ops, req)
}
for {
res, err := s.conn.Multi(ops...)
if err != nil {
return err
}
var retry []any
for i, res := range res {
if res.Error != nil {
if errors.Is(res.Error, zk.ErrNoNode) {
if req, ok := ops[i].(*zk.SetDataRequest); ok {
retry = append(retry, s.newCreateRequest(req))
continue
}
}
err = multierror.Append(err, res.Error)
}
}
if err != nil || retry == nil {
return err
}
ops = retry
}
}
func (s *StateStore) newCreateRequest(req *zk.SetDataRequest) *zk.CreateRequest {
return &zk.CreateRequest{Path: req.Path, Data: req.Data}
}
func (s *StateStore) newDeleteRequest(req *state.DeleteRequest) (*zk.DeleteRequest, error) { func (s *StateStore) newDeleteRequest(req *state.DeleteRequest) (*zk.DeleteRequest, error) {
err := state.CheckRequestOptions(req) err := state.CheckRequestOptions(req)
if err != nil { if err != nil {

View File

@ -21,7 +21,6 @@ import (
"github.com/go-zookeeper/zk" "github.com/go-zookeeper/zk"
gomock "github.com/golang/mock/gomock" gomock "github.com/golang/mock/gomock"
"github.com/hashicorp/go-multierror"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/dapr/components-contrib/state" "github.com/dapr/components-contrib/state"
@ -146,48 +145,6 @@ func TestDelete(t *testing.T) {
}) })
} }
// BulkDelete.
func TestBulkDelete(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
conn := NewMockConn(ctrl)
s := StateStore{conn: conn}
t.Run("With keys", func(t *testing.T) {
conn.EXPECT().Multi([]interface{}{
&zk.DeleteRequest{Path: "foo", Version: int32(anyVersion)},
&zk.DeleteRequest{Path: "bar", Version: int32(anyVersion)},
}).Return([]zk.MultiResponse{{}, {}}, nil).Times(1)
err := s.BulkDelete(context.Background(), []state.DeleteRequest{{Key: "foo"}, {Key: "bar"}})
assert.NoError(t, err, "Key must be exists")
})
t.Run("With keys and error", func(t *testing.T) {
conn.EXPECT().Multi([]interface{}{
&zk.DeleteRequest{Path: "foo", Version: int32(anyVersion)},
&zk.DeleteRequest{Path: "bar", Version: int32(anyVersion)},
}).Return([]zk.MultiResponse{
{Error: zk.ErrUnknown}, {Error: zk.ErrNoAuth},
}, nil).Times(1)
err := s.BulkDelete(context.Background(), []state.DeleteRequest{{Key: "foo"}, {Key: "bar"}})
assert.Equal(t, err.(*multierror.Error).Errors, []error{zk.ErrUnknown, zk.ErrNoAuth})
})
t.Run("With keys and ignore NoNode error", func(t *testing.T) {
conn.EXPECT().Multi([]interface{}{
&zk.DeleteRequest{Path: "foo", Version: int32(anyVersion)},
&zk.DeleteRequest{Path: "bar", Version: int32(anyVersion)},
}).Return([]zk.MultiResponse{
{Error: zk.ErrNoNode}, {},
}, nil).Times(1)
err := s.BulkDelete(context.Background(), []state.DeleteRequest{{Key: "foo"}, {Key: "bar"}})
assert.NoError(t, err, "Key must be exists")
})
}
// Set. // Set.
func TestSet(t *testing.T) { func TestSet(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
@ -237,57 +194,3 @@ func TestSet(t *testing.T) {
assert.NoError(t, err, "Key must be create") assert.NoError(t, err, "Key must be create")
}) })
} }
// BulkSet.
func TestBulkSet(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
conn := NewMockConn(ctrl)
s := StateStore{conn: conn}
t.Run("With keys", func(t *testing.T) {
conn.EXPECT().Multi([]interface{}{
&zk.SetDataRequest{Path: "foo", Data: []byte("\"bar\""), Version: int32(anyVersion)},
&zk.SetDataRequest{Path: "bar", Data: []byte("\"foo\""), Version: int32(anyVersion)},
}).Return([]zk.MultiResponse{{}, {}}, nil).Times(1)
err := s.BulkSet(context.Background(), []state.SetRequest{
{Key: "foo", Value: "bar"},
{Key: "bar", Value: "foo"},
})
assert.NoError(t, err, "Key must be set")
})
t.Run("With keys and error", func(t *testing.T) {
conn.EXPECT().Multi([]interface{}{
&zk.SetDataRequest{Path: "foo", Data: []byte("\"bar\""), Version: int32(anyVersion)},
&zk.SetDataRequest{Path: "bar", Data: []byte("\"foo\""), Version: int32(anyVersion)},
}).Return([]zk.MultiResponse{
{Error: zk.ErrUnknown}, {Error: zk.ErrNoAuth},
}, nil).Times(1)
err := s.BulkSet(context.Background(), []state.SetRequest{
{Key: "foo", Value: "bar"},
{Key: "bar", Value: "foo"},
})
assert.Equal(t, err.(*multierror.Error).Errors, []error{zk.ErrUnknown, zk.ErrNoAuth})
})
t.Run("With keys and retry NoNode error", func(t *testing.T) {
conn.EXPECT().Multi([]interface{}{
&zk.SetDataRequest{Path: "foo", Data: []byte("\"bar\""), Version: int32(anyVersion)},
&zk.SetDataRequest{Path: "bar", Data: []byte("\"foo\""), Version: int32(anyVersion)},
}).Return([]zk.MultiResponse{
{Error: zk.ErrNoNode}, {},
}, nil).Times(1)
conn.EXPECT().Multi([]interface{}{
&zk.CreateRequest{Path: "foo", Data: []byte("\"bar\"")},
}).Return([]zk.MultiResponse{{}, {}}, nil).Times(1)
err := s.BulkSet(context.Background(), []state.SetRequest{
{Key: "foo", Value: "bar"},
{Key: "bar", Value: "foo"},
})
assert.NoError(t, err, "Key must be set")
})
}

View File

@ -12,14 +12,14 @@ require (
github.com/apache/pulsar-client-go v0.9.0 github.com/apache/pulsar-client-go v0.9.0
github.com/apache/thrift v0.13.0 github.com/apache/thrift v0.13.0
github.com/aws/aws-sdk-go v1.44.214 github.com/aws/aws-sdk-go v1.44.214
github.com/benbjohnson/clock v1.3.0 github.com/benbjohnson/clock v1.3.4
github.com/cenkalti/backoff/v4 v4.2.1 github.com/cenkalti/backoff/v4 v4.2.1
github.com/cloudwego/kitex v0.5.0 github.com/cloudwego/kitex v0.5.0
github.com/cloudwego/kitex-examples v0.1.1 github.com/cloudwego/kitex-examples v0.1.1
github.com/dapr/components-contrib v1.10.6-0.20230426221256-e099a548fbb5 github.com/dapr/components-contrib v1.11.0-rc.1
github.com/dapr/dapr v1.10.5-rc.1.0.20230430203526-7a0fdf9f016b github.com/dapr/dapr v1.10.5-rc.1.0.20230430203526-7a0fdf9f016b
github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37 github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37
github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41 github.com/dapr/kit v0.0.5
github.com/eclipse/paho.mqtt.golang v1.4.2 github.com/eclipse/paho.mqtt.golang v1.4.2
github.com/go-chi/chi/v5 v5.0.8 github.com/go-chi/chi/v5 v5.0.8
github.com/go-redis/redis/v8 v8.11.5 github.com/go-redis/redis/v8 v8.11.5
@ -37,8 +37,8 @@ require (
go.mongodb.org/mongo-driver v1.11.2 go.mongodb.org/mongo-driver v1.11.2
go.uber.org/multierr v1.11.0 go.uber.org/multierr v1.11.0
go.uber.org/ratelimit v0.2.0 go.uber.org/ratelimit v0.2.0
golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc
modernc.org/sqlite v1.21.1 modernc.org/sqlite v1.22.1
) )
require ( require (
@ -110,7 +110,7 @@ require (
github.com/eapache/go-resiliency v1.3.0 // indirect github.com/eapache/go-resiliency v1.3.0 // indirect
github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 // indirect
github.com/eapache/queue v1.1.0 // indirect github.com/eapache/queue v1.1.0 // indirect
github.com/emicklei/go-restful/v3 v3.9.0 // indirect github.com/emicklei/go-restful/v3 v3.10.2 // indirect
github.com/evanphx/json-patch/v5 v5.6.0 // indirect github.com/evanphx/json-patch/v5 v5.6.0 // indirect
github.com/fasthttp/router v1.4.18 // indirect github.com/fasthttp/router v1.4.18 // indirect
github.com/fatih/color v1.15.0 // indirect github.com/fatih/color v1.15.0 // indirect
@ -127,7 +127,7 @@ require (
github.com/go-playground/locales v0.14.0 // indirect github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.11.0 // indirect github.com/go-playground/validator/v10 v10.11.0 // indirect
github.com/go-sql-driver/mysql v1.7.0 // indirect github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/goccy/go-json v0.10.2 // indirect github.com/goccy/go-json v0.10.2 // indirect
github.com/gocql/gocql v1.3.1 // indirect github.com/gocql/gocql v1.3.1 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
@ -197,7 +197,7 @@ require (
github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.18 // indirect github.com/mattn/go-isatty v0.0.18 // indirect
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
github.com/microsoft/durabletask-go v0.2.1-0.20230409004853-b1c4226121e6 // indirect github.com/microsoft/durabletask-go v0.2.1 // indirect
github.com/microsoft/go-mssqldb v0.21.0 // indirect github.com/microsoft/go-mssqldb v0.21.0 // indirect
github.com/miekg/dns v1.1.50 // indirect github.com/miekg/dns v1.1.50 // indirect
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 // indirect
@ -216,7 +216,7 @@ require (
github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect
github.com/openzipkin/zipkin-go v0.4.1 // indirect github.com/openzipkin/zipkin-go v0.4.1 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pierrec/lz4 v2.6.0+incompatible // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect
github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
github.com/pkg/errors v0.9.1 // indirect github.com/pkg/errors v0.9.1 // indirect
@ -228,14 +228,14 @@ require (
github.com/prometheus/procfs v0.8.0 // indirect github.com/prometheus/procfs v0.8.0 // indirect
github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
github.com/redis/go-redis/v9 v9.0.3 // indirect github.com/redis/go-redis/v9 v9.0.4 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee // indirect
github.com/shirou/gopsutil/v3 v3.22.2 // indirect github.com/shirou/gopsutil/v3 v3.22.2 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect
github.com/sony/gobreaker v0.5.0 // indirect github.com/sony/gobreaker v0.5.0 // indirect
github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect
github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cast v1.5.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/pflag v1.0.5 // indirect
github.com/stoewer/go-strcase v1.2.0 // indirect github.com/stoewer/go-strcase v1.2.0 // indirect
github.com/stretchr/objx v0.5.0 // indirect github.com/stretchr/objx v0.5.0 // indirect
@ -246,7 +246,7 @@ require (
github.com/tklauser/go-sysconf v0.3.10 // indirect github.com/tklauser/go-sysconf v0.3.10 // indirect
github.com/tklauser/numcpus v0.4.0 // indirect github.com/tklauser/numcpus v0.4.0 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasthttp v1.45.0 // indirect github.com/valyala/fasthttp v1.47.0 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect
@ -264,17 +264,17 @@ require (
go.opentelemetry.io/proto/otlp v0.19.0 // indirect go.opentelemetry.io/proto/otlp v0.19.0 // indirect
go.uber.org/atomic v1.10.0 // indirect go.uber.org/atomic v1.10.0 // indirect
go.uber.org/zap v1.24.0 // indirect go.uber.org/zap v1.24.0 // indirect
golang.org/x/arch v0.2.0 // indirect golang.org/x/arch v0.3.0 // indirect
golang.org/x/crypto v0.8.0 // indirect golang.org/x/crypto v0.9.0 // indirect
golang.org/x/mod v0.10.0 // indirect golang.org/x/mod v0.10.0 // indirect
golang.org/x/net v0.9.0 // indirect golang.org/x/net v0.10.0 // indirect
golang.org/x/oauth2 v0.7.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect
golang.org/x/sync v0.1.0 // indirect golang.org/x/sync v0.2.0 // indirect
golang.org/x/sys v0.7.0 // indirect golang.org/x/sys v0.8.0 // indirect
golang.org/x/term v0.7.0 // indirect golang.org/x/term v0.8.0 // indirect
golang.org/x/text v0.9.0 // indirect golang.org/x/text v0.9.0 // indirect
golang.org/x/time v0.3.0 // indirect golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.7.0 // indirect golang.org/x/tools v0.9.1 // indirect
golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
google.golang.org/api v0.115.0 // indirect google.golang.org/api v0.115.0 // indirect
@ -298,7 +298,7 @@ require (
lukechampine.com/uint128 v1.3.0 // indirect lukechampine.com/uint128 v1.3.0 // indirect
modernc.org/cc/v3 v3.40.0 // indirect modernc.org/cc/v3 v3.40.0 // indirect
modernc.org/ccgo/v3 v3.16.13 // indirect modernc.org/ccgo/v3 v3.16.13 // indirect
modernc.org/libc v1.22.3 // indirect modernc.org/libc v1.22.6 // indirect
modernc.org/mathutil v1.5.0 // indirect modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect
modernc.org/opt v0.1.3 // indirect modernc.org/opt v0.1.3 // indirect
@ -311,3 +311,5 @@ require (
) )
replace github.com/dapr/components-contrib => ../../ replace github.com/dapr/components-contrib => ../../
replace github.com/dapr/dapr => github.com/italypaleale/dapr v1.6.1-0.20230517003350-c5aed3bc5b0f

View File

@ -198,8 +198,9 @@ github.com/aws/aws-sdk-go-v2/service/sso v1.4.2/go.mod h1:NBvT9R1MEF+Ud6ApJKM0G+
github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g= github.com/aws/aws-sdk-go-v2/service/sts v1.7.2/go.mod h1:8EzeIqfWt2wWT4rJVu3f21TfrhJ8AEMzVybRNSb/b4g=
github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A=
github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/benbjohnson/clock v1.3.4 h1:wj3BFPrTw8yYgA1OlMqvUk95nc8OMv3cvBSF5erT2W4=
github.com/benbjohnson/clock v1.3.4/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
@ -342,12 +343,10 @@ github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X
github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0= github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0=
github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0= github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0=
github.com/dapr/dapr v1.10.5-rc.1.0.20230430203526-7a0fdf9f016b h1:+6TVW2t2GveAxqVNSOezU2fUJVec5MCS5J/MXycfwFs=
github.com/dapr/dapr v1.10.5-rc.1.0.20230430203526-7a0fdf9f016b/go.mod h1:o/M7becq2NE4unx2v3Hv6vq2DrLmUQx5Knkn+6QTkY4=
github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37 h1:gAiBprMLnsdaz4mhr28RlmK1PTnz+UXDNy0Giujty5c= github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37 h1:gAiBprMLnsdaz4mhr28RlmK1PTnz+UXDNy0Giujty5c=
github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37/go.mod h1:+ec5FDv7wGcy+Hlg7vY6msKQClm6es2Q5yCGbDHoURQ= github.com/dapr/go-sdk v1.6.1-0.20230427230219-d485c1775c37/go.mod h1:+ec5FDv7wGcy+Hlg7vY6msKQClm6es2Q5yCGbDHoURQ=
github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41 h1:G55KmJAn2UsJm2+T0Vyz8gPcbphDe1PvjrES18JxfHQ= github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg=
github.com/dapr/kit v0.0.5-0.20230418193628-15a7040dec41/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@ -398,8 +397,8 @@ github.com/eclipse/paho.mqtt.golang v1.4.2 h1:66wOzfUHSSI1zamx7jR6yMEI5EuHnT1G6r
github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA= github.com/eclipse/paho.mqtt.golang v1.4.2/go.mod h1:JGt0RsEwEX+Xa/agj90YJ9d9DH2b7upDZMK9HRbFvCA=
github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.8.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/go-restful/v3 v3.9.0 h1:XwGDlfxEnQZzuopoqxwSEllNcCOM9DhhFyhFIIGKwxE= github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE=
github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
@ -435,7 +434,7 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8
github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y= github.com/frankban/quicktest v1.10.0/go.mod h1:ui7WezCLWMWxVWr1GETZY3smRy0G4KWq9vcPtJmFl7Y=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
@ -508,8 +507,8 @@ github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq
github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I= github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= github.com/go-test/deep v1.0.2-0.20181118220953-042da051cf31/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
@ -772,6 +771,8 @@ github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk=
github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/italypaleale/dapr v1.6.1-0.20230517003350-c5aed3bc5b0f h1:4FT6qv1JAyBezr6MYHzSvKmp8YqMhC+wvIm85diT73k=
github.com/italypaleale/dapr v1.6.1-0.20230517003350-c5aed3bc5b0f/go.mod h1:Y/h2dMv9ZpWOXzrp2GyIuxlpsCEZ2xBZ49FNPD4Zz5I=
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
@ -866,8 +867,8 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@ -939,8 +940,8 @@ github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwp
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
github.com/microsoft/durabletask-go v0.2.1-0.20230409004853-b1c4226121e6 h1:MOZFQfiTG1CDRW1ZZD9zpMbzYK99a1ZCvhHm4dYkbSc= github.com/microsoft/durabletask-go v0.2.1 h1:ZSEJi43KOEALwWOlj0oJI2LezEgwQeUsITyTUbH2DYQ=
github.com/microsoft/durabletask-go v0.2.1-0.20230409004853-b1c4226121e6/go.mod h1:UtJXHmKalksdccRiN9Y16cHJYYtZN0bqmqOSiy56V8g= github.com/microsoft/durabletask-go v0.2.1/go.mod h1:UtJXHmKalksdccRiN9Y16cHJYYtZN0bqmqOSiy56V8g=
github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8= github.com/microsoft/go-mssqldb v0.21.0 h1:p2rpHIL7TlSv1QrbXJUAcbyRKnIT0C9rRkH2E4OjLn8=
github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4= github.com/microsoft/go-mssqldb v0.21.0/go.mod h1:+4wZTUnz/SV6nffv+RRRB/ss8jPng5Sho2SmM1l2ts4=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
@ -1068,8 +1069,8 @@ github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM=
github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc=
github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ= github.com/pkg/browser v0.0.0-20210115035449-ce105d075bb4/go.mod h1:N6UoU20jOqggOuDwUaBQpluzLNDqif3kq9z2wpdYEfQ=
@ -1148,8 +1149,8 @@ github.com/rabbitmq/amqp091-go v1.7.0/go.mod h1:wfClAtY0C7bOHxd3GjmF26jEHn+rR/0B
github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/redis/go-redis/v9 v9.0.3 h1:+7mmR26M0IvyLxGZUHxu4GiBkJkVDid0Un+j4ScYu4k= github.com/redis/go-redis/v9 v9.0.4 h1:FC82T+CHJ/Q/PdyLW++GeCO+Ol59Y4T7R4jbgjvktgc=
github.com/redis/go-redis/v9 v9.0.3/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk= github.com/redis/go-redis/v9 v9.0.4/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDOjzMvcuQHk=
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
@ -1203,8 +1204,8 @@ github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY=
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
@ -1285,8 +1286,8 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb
github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasthttp v1.45.0 h1:zPkkzpIn8tdHZUrVa6PzYd0i5verqiPSkgTd3bSUcpA= github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c=
github.com/valyala/fasthttp v1.45.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
@ -1420,8 +1421,9 @@ go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4= golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5PaJvn9wGP0agmIOqjrtsKGRguv4=
golang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.0.0-20220722155209-00200b7164a7/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.2.0 h1:W1sUEHXiJTfjaFJ5SLo0N6lZn+0eO5gWD1MFeTGqQEY=
golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/arch v0.2.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@ -1442,8 +1444,8 @@ golang.org/x/crypto v0.0.0-20220511200225-c6db032c6c88/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@ -1459,8 +1461,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw=
golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c h1:HDdYQYKOkvJT/Plb5HwJJywTVyUnIctjQm6XSnZ/0CY= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
golang.org/x/exp v0.0.0-20230419192730-864b3d6c5c2c/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
@ -1571,8 +1573,8 @@ golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM= golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=
golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@ -1588,8 +1590,8 @@ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= golang.org/x/oauth2 v0.8.0 h1:6dkIjl3j3LtZ/O3sTgZTMsLKSftL/B8Zgq4huOIIUu8=
golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@ -1603,8 +1605,9 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@ -1717,15 +1720,15 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
golang.org/x/term v0.7.0 h1:BEvjmm5fURWqcfbSKTdpkDXYBrUS1c0m8agp14W48vQ= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols=
golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@ -1826,8 +1829,8 @@ golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyj
golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= golang.org/x/tools v0.9.1 h1:8WMNJAz3zrtPmnYC7ISf5dEn3MT0gY7jBJfw27yrrLo=
golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@ -2067,22 +2070,22 @@ modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw=
modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY=
modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk=
modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM=
modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= modernc.org/libc v1.22.6 h1:cbXU8R+A6aOjRuhsFh3nbDWXO/Hs4ClJRXYB11KmPDo=
modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= modernc.org/libc v1.22.6/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY=
modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds=
modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE=
modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk=
modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY=
modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw=
modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY=
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=

View File

@ -191,7 +191,7 @@ func TestAzureCosmosDBStorage(t *testing.T) {
Metadata: setMetadata, Metadata: setMetadata,
}) })
} }
err := store.BulkSet(ctx, reqs) err := store.BulkSet(ctx, reqs, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
}) })
@ -249,7 +249,7 @@ func TestAzureCosmosDBStorage(t *testing.T) {
} }
// Delete // Delete
err := store.BulkDelete(ctx, deleteReqs) err := store.BulkDelete(ctx, deleteReqs, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
// Retrieve // Retrieve

View File

@ -357,7 +357,7 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
}) })
} }
} }
err := statestore.BulkSet(context.Background(), bulk) err := statestore.BulkSet(context.Background(), bulk, state.BulkStoreOpts{})
require.NoError(t, err) require.NoError(t, err)
for _, scenario := range scenarios { for _, scenario := range scenarios {
@ -412,7 +412,7 @@ func ConformanceTests(t *testing.T, props map[string]string, statestore state.St
}) })
} }
} }
err := statestore.BulkDelete(context.Background(), bulk) err := statestore.BulkDelete(context.Background(), bulk, state.BulkStoreOpts{})
assert.NoError(t, err) assert.NoError(t, err)
for _, req := range bulk { for _, req := range bulk {

View File

@ -187,7 +187,8 @@ func DeployProcess(
} }
// TODO: pb.DeployProcessResponse is deprecated and needs to be replaced eventually // TODO: pb.DeployProcessResponse is deprecated and needs to be replaced eventually
deployment := &pb.DeployProcessResponse{} //nolint:staticcheck //nolint:staticcheck
deployment := &pb.DeployProcessResponse{}
err = json.Unmarshal(res.Data, deployment) err = json.Unmarshal(res.Data, deployment)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -4,7 +4,7 @@ go 1.20
require ( require (
github.com/dapr/components-contrib v1.10.6-0.20230403162214-9ee9d56cb7ea github.com/dapr/components-contrib v1.10.6-0.20230403162214-9ee9d56cb7ea
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce github.com/dapr/kit v0.0.5
) )
require ( require (
@ -21,10 +21,10 @@ require (
github.com/nats-io/nkeys v0.3.0 // indirect github.com/nats-io/nkeys v0.3.0 // indirect
github.com/nats-io/nuid v1.0.1 // indirect github.com/nats-io/nuid v1.0.1 // indirect
github.com/sirupsen/logrus v1.9.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect
github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cast v1.5.1 // indirect
golang.org/x/crypto v0.8.0 // indirect golang.org/x/crypto v0.9.0 // indirect
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect
golang.org/x/sys v0.7.0 // indirect golang.org/x/sys v0.8.0 // indirect
google.golang.org/protobuf v1.30.0 // indirect google.golang.org/protobuf v1.30.0 // indirect
) )

View File

@ -4,12 +4,12 @@ github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.13.0 h1:iPKdoP+7qq68
github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.13.0/go.mod h1:Wpbh+0sQ/E5AA5EpqLncez2noG65dlyedpp5qfoYyPE= github.com/cloudevents/sdk-go/binding/format/protobuf/v2 v2.13.0/go.mod h1:Wpbh+0sQ/E5AA5EpqLncez2noG65dlyedpp5qfoYyPE=
github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136fLXGsYw= github.com/cloudevents/sdk-go/v2 v2.13.0 h1:2zxDS8RyY1/wVPULGGbdgniGXSzLaRJVl136fLXGsYw=
github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To= github.com/cloudevents/sdk-go/v2 v2.13.0/go.mod h1:xDmKfzNjM8gBvjaF8ijFjM1VYOVUEeUfapHMUX1T5To=
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce h1:Izd5gVwKZ9Gn01nXOENaM1sJRsmJFK7JO+OfHWeOh2M= github.com/dapr/kit v0.0.5 h1:BbjO6LksdXAv6iuTVZiHJNkXj9Ii1gS2wA1u785Ypsg=
github.com/dapr/kit v0.0.5-0.20230418170151-c93a9df941ce/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY= github.com/dapr/kit v0.0.5/go.mod h1:VTWiX6nk5RWZ/kqEJD/EGjJU8hdwHZ73r75K510OHBY=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
@ -21,7 +21,7 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY= github.com/klauspost/compress v1.16.3 h1:XuJt9zzcnaz6a16/OU53ZjWp/v7/42WcR5t2a0PcNQY=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g=
github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY= github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmLKZf+SjVanKKhCgf3bg+511DmU9eDQTen7LLbY=
@ -41,11 +41,11 @@ github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
@ -54,15 +54,15 @@ go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60=
golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.8.0 h1:pd9TJtTueMTVQXzk8E2XESSMQDj/U7OUu0PqJqPXQjQ= golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=
golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=
golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=